Split monolithic App impl into 5 specialized trait modules: - methods/navigation.rs (NavigationMethods) - 7 methods for chat navigation - methods/messages.rs (MessageMethods) - 8 methods for message operations - methods/compose.rs (ComposeMethods) - 10 methods for reply/forward/draft - methods/search.rs (SearchMethods) - 15 methods for search functionality - methods/modal.rs (ModalMethods) - 27 methods for modal dialogs Changes: - app/mod.rs: 1015→371 lines (removed 644 lines, -63%) - Created app/methods/ with 5 trait impl blocks - Left in app/mod.rs: constructors, get_command, get_selected_chat_id/chat, getters/setters - 116 functions → 5 trait impl blocks (67 in traits + 48 in core) - Single Responsibility Principle achieved - Updated CONTEXT.md with refactoring metrics - Updated ROADMAP.md: Phase 13 Etap 2 marked as DONE Phase 13 Etap 2: COMPLETED (100%) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
35 KiB
35 KiB
Roadmap
Фаза 1: Базовая инфраструктура [DONE]
- Настройка проекта (Cargo.toml)
- TUI фреймворк (ratatui + crossterm)
- Базовый layout (папки, список чатов, область сообщений)
- Vim-style навигация (hjkl, стрелки)
- Русская раскладка (ролд)
Фаза 2: TDLib интеграция [DONE]
- Подключение tdlib-rs
- Авторизация (телефон + код + 2FA)
- Сохранение сессии
- Загрузка списка чатов
- Загрузка истории сообщений
- Отключение логов TDLib
Фаза 3: Улучшение UX [DONE]
- Отправка сообщений
- Фильтрация чатов (только Main, без архива)
- Поиск по чатам (Ctrl+S)
- Скролл истории сообщений
- Загрузка имён пользователей (вместо User_ID)
- Отметка сообщений как прочитанные
- Реальное время: новые сообщения
Фаза 4: Папки и фильтрация [DONE]
- Загрузка папок из Telegram
- Переключение между папками (1-9)
- Фильтрация чатов по папке
Фаза 5: Расширенный функционал [DONE]
- Отображение онлайн-статуса (зелёная точка ●)
- Статус доставки/прочтения (✓, ✓✓)
- Поддержка медиа-заглушек (фото, видео, голосовые, стикеры и др.)
- Mentions (@) — индикатор непрочитанных упоминаний
- Muted чаты (иконка 🔇)
Фаза 6: Полировка [DONE]
- Оптимизация использования памяти (базовая)
- Очистка сообщений при закрытии чата
- Лимит кэша пользователей (500)
- Периодическая очистка неактивных записей
- Оптимизация 60 FPS
- Poll таймаут 16ms
- Флаг
needs_redraw— рендеринг только при изменениях - Обработка Event::Resize для перерисовки при изменении размера
- Минимальное разрешение (80x20)
- Предупреждение если терминал слишком мал
- Обработка ошибок сети
- NetworkState enum (WaitingForNetwork, Connecting, etc.)
- Индикатор в футере с цветовой индикацией
- Graceful shutdown
- AtomicBool флаг для остановки polling
- Корректное закрытие TDLib клиента
- Таймаут ожидания завершения задач
- Динамический инпут
- Автоматическое расширение до 10 строк
- Wrap для длинного текста
- Перенос длинных сообщений
- Автоматический wrap на несколько строк
- Правильное выравнивание для исходящих/входящих
Фаза 7: Глубокий рефакторинг памяти [DONE]
- Удалить дублирование current_messages между App и TdClient
- Использовать единый источник данных для сообщений
- Реализовать LRU-кэш для user_names/user_statuses вместо простого лимита
- Lazy loading для имён пользователей (батчевая загрузка последних 5 за цикл)
- Лимиты памяти:
- MAX_MESSAGES_IN_CHAT = 500
- MAX_CHATS = 200
- MAX_CHAT_USER_IDS = 500
- MAX_USER_CACHE_SIZE = 500 (LRU)
Фаза 8: Дополнительные фичи [DONE]
- Markdown форматирование в сообщениях
- Bold, Italic, Underline, Strikethrough
- Code (inline, Pre, PreCode)
- Spoiler (скрытый текст)
- URLs, упоминания (@)
- Редактирование сообщений
- ↑ при пустом инпуте → выбор сообщения
- Enter для начала редактирования
- Подсветка выбранного сообщения (▶)
- Esc для отмены
- Удаление сообщений
- d / в / Delete в режиме выбора
- Модалка подтверждения (y/n)
- Удаление для всех если возможно
- Индикатор редактирования (✎)
- Отображается рядом с временем для отредактированных сообщений
- Блочный курсор в поле ввода
- Vim-style курсор █
- Перемещение ←/→, Home/End
- Редактирование в любой позиции
- Reply на сообщения
r/кв режиме выбора → режим ответа- Превью сообщения в поле ввода
- Esc для отмены
- Forward сообщений
f/ав режиме выбора → режим пересылки- Превью сообщения в поле ввода
- Выбор чата стрелками, Enter для пересылки
- Esc для отмены
- Отображение "↪ Переслано от" для пересланных сообщений
Фаза 9: Расширенные возможности [DONE]
- Typing indicator ("печатает...")
- Показывать когда собеседник печатает
- Отправлять свой статус печати при наборе текста
- Закреплённые сообщения (Pinned)
- Отображать pinned message вверху открытого чата
- Клик/хоткей для перехода к закреплённому сообщению
- Поиск по сообщениям в чате
Ctrl+F— поиск текста внутри открытого чата- Навигация по результатам (n/N или стрелки)
- Подсветка найденных совпадений
- Черновики
- Сохранять набранный текст при переключении между чатами
- Индикатор черновика в списке чатов
- Восстановление текста при возврате в чат
- Профиль пользователя/чата
Ctrl+i— открыть информацию о чате/собеседнике- Для личных чатов: имя, username, телефон, био
- Для групп: название, описание, количество участников
- Копирование сообщений
y/нв режиме выбора — скопировать текст в системный буфер обмена- Использовать clipboard crate для кроссплатформенности
- Реакции
- Отображение реакций под сообщениями
eв режиме выбора — добавить реакцию (emoji picker)- Список доступных реакций чата
- Конфигурационный файл
~/.config/tele-tui/config.toml- Настройки: цветовая схема, часовой пояс, хоткеи
- Загрузка конфига при старте
Фаза 10: Desktop уведомления [DONE - 83%]
Стадия 1: Базовая реализация [DONE]
- NotificationManager модуль
- notify-rust интеграция (версия 4.11)
- Feature flag "notifications" в Cargo.toml
- Базовая структура с настройками
- Конфигурация уведомлений
- NotificationsConfig в config.toml
- enabled: bool - вкл/выкл уведомлений
- only_mentions: bool - только упоминания
- show_preview: bool - показывать превью текста
- Интеграция с TdClient
- Поле notification_manager в TdClient
- Метод configure_notifications()
- Обработка в handle_new_message_update()
- Базовая отправка уведомлений
- Уведомления для сообщений не из текущего чата
- Форматирование title (имя чата) и body (текст/медиа-заглушка)
- Sender name из MessageInfo
Стадия 2: Улучшения [IN PROGRESS]
- Синхронизация muted чатов
- Загрузка списка muted чатов из Telegram
- Вызов sync_muted_chats() при инициализации и обновлении (Ctrl+R)
- Muted чаты автоматически фильтруются из уведомлений
- Фильтрация по упоминаниям
- Метод MessageInfo::has_mention() проверяет TextEntityType::Mention и MentionName
- NotificationManager применяет фильтр only_mentions из конфига
- Работает для @username и inline mentions
- Поддержка типов медиа
- Метод beautify_media_labels() заменяет текстовые заглушки на emoji
- Поддержка: 📷 Фото, 🎥 Видео, 🎞️ GIF, 🎤 Голосовое, 🎨 Стикер
- Также: 📎 Файл, 🎵 Аудио, 📹 Видеосообщение, 📍 Локация, 👤 Контакт, 📊 Опрос
- Кастомизация звуков
- Настройка звуков уведомлений в config.toml
- Разные звуки для разных типов сообщений
Стадия 3: Полировка [DONE]
- Обработка ошибок
- Graceful fallback если уведомления недоступны (возвращает Ok без паники)
- Логирование ошибок через tracing::warn!
- Детальное логирование причин пропуска уведомлений (debug level)
- Дополнительные настройки
- timeout_ms - продолжительность показа (0 = системное значение)
- urgency - уровень важности: "low", "normal", "critical" (только Linux)
- Красивые эмодзи для типов медиа
- Опциональные улучшения (не критично)
- Кросс-платформенное тестирование (требует ручного тестирования)
- icon - кастомная иконка приложения
- Actions в уведомлениях (кнопки "Ответить", "Прочитано")
Фаза 11: Показ изображений в чате [PLANNED]
Этап 1: Инфраструктура [TODO]
- Модуль src/media/
- image_cache.rs - LRU кэш для загруженных изображений
- image_loader.rs - Асинхронная загрузка через TDLib
- image_renderer.rs - Рендеринг в ratatui
- Зависимости
- ratatui-image 1.0 - поддержка изображений в TUI
- Определение протокола терминала (Sixel/Kitty/iTerm2/Halfblocks)
- ImageCache с лимитами
- LRU кэш с максимальным размером в МБ
- Автоматическая очистка старых изображений
- MAX_IMAGE_CACHE_SIZE = 100 MB (по умолчанию)
Этап 2: Интеграция с TDLib [TODO]
- Обработка MessageContentPhoto
- Добавить PhotoInfo в MessageInfo
- Извлечение file_id, width, height из Photo
- Выбор оптимального размера изображения (до 800px)
- Загрузка файлов
- Метод TdClient::download_photo(file_id)
- Асинхронная загрузка через downloadFile API
- Обработка состояний загрузки (pending/downloading/ready)
- Кэширование
- Сохранение путей к загруженным файлам
- Повторное использование уже загруженных изображений
Этап 3: Рендеринг в UI [TODO]
- Модификация render_messages()
- Определение возможностей терминала при старте
- Рендеринг изображений через ratatui-image
- Автоматическое масштабирование под размер области
- Сохранение aspect ratio
- Превью в списке сообщений
- Миниатюры размером 20x10 символов
- Lazy loading (загрузка только видимых)
- Placeholder пока изображение грузится
- Индикатор загрузки
- Текстовая заглушка "[Загрузка фото...]"
- Progress bar для больших файлов
- Процент загрузки
Этап 4: Полноэкранный просмотр [TODO]
- Новый режим: ViewImage
v/мв режиме выбора - открыть изображение- Показ на весь экран терминала
Escдля закрытия
- Информация об изображении
- Размер файла
- Разрешение (width x height)
- Формат (JPEG/PNG/GIF)
- Навигация
←/→- предыдущее/следующее изображение в чате- Автоматическая загрузка соседних изображений
Этап 5: Конфигурация и UX [TODO]
- MediaConfig в config.toml
- show_images: bool - включить/отключить показ изображений
- image_cache_mb: usize - размер кэша в МБ
- preview_quality: "low" | "medium" | "high"
- render_protocol: "auto" | "sixel" | "kitty" | "iterm2" | "halfblocks"
- Поддержка различных терминалов
- Auto-detection протокола при старте
- Fallback на Unicode halfblocks для любого терминала
- Опция отключения изображений если терминал не поддерживает
- Оптимизация производительности
- Асинхронная загрузка (не блокирует UI)
- Приоритизация видимых изображений
- Fast resize для превью
- Кэширование отмасштабированных версий
Этап 6: Обработка ошибок [TODO]
- Graceful fallback
- Текстовая заглушка "[Фото]" если загрузка не удалась
- Повторная попытка по запросу пользователя
- Логирование проблем через tracing
- Ограничения
- Таймаут загрузки (30 сек)
- Максимальный размер файла для автозагрузки (10 MB)
- Предупреждение для больших файлов
Технические детали
- Поддерживаемые протоколы:
- Sixel (xterm, WezTerm, mintty)
- Kitty Graphics Protocol (Kitty terminal)
- iTerm2 Inline Images (iTerm2 на macOS)
- Unicode Halfblocks (fallback для всех)
- Поддерживаемые форматы:
- JPEG, PNG, GIF, WebP, BMP
- Новые хоткеи:
v/м- открыть изображение в полном размере (режим выбора)←/→- навигация между изображениями (в режиме просмотра)Esc- закрыть полноэкранный просмотр
Фаза 12: Прослушивание голосовых сообщений [PLANNED]
Этап 1: Инфраструктура аудио [TODO]
- Модуль src/audio/
- player.rs - AudioPlayer на rodio
- cache.rs - VoiceCache для загруженных файлов
- state.rs - PlaybackState (статус, позиция, громкость)
- Зависимости
- rodio 0.17 - Pure Rust аудио библиотека
- Feature flag "audio" в Cargo.toml
- AudioPlayer API
- play() - воспроизведение файла
- pause() / resume() - пауза/возобновление
- stop() - остановка
- seek() - перемотка
- set_volume() - регулировка громкости
- get_position() - текущая позиция
- VoiceCache
- Кэш загруженных OGG файлов в ~/.cache/tele-tui/voice/
- LRU политика очистки
- MAX_VOICE_CACHE_SIZE = 100 MB
Этап 2: Интеграция с TDLib [TODO]
- Обработка MessageContentVoiceNote
- Добавить VoiceNoteInfo в MessageInfo
- Извлечение file_id, duration, mime_type, waveform
- Метка формата (OGG Opus обычно)
- Загрузка файлов
- Метод TdClient::download_voice_note(file_id)
- Асинхронная загрузка через downloadFile API
- Обработка состояний (pending/downloading/ready)
- Кэширование
- Сохранение путей к загруженным файлам
- Не перезагружать уже скачанные голосовые
- Проверка существования файла перед воспроизведением
Этап 3: UI для воспроизведения [TODO]
- Индикатор в сообщении
- Иконка 🎤 и длительность голосового
- Progress bar во время воспроизведения
- Статус: ▶ (playing), ⏸ (paused), ⏹ (stopped), ⏳ (loading)
- Текущее время / общая длительность (0:08 / 0:15)
- Модификация render_messages()
- render_voice_note() для голосовых сообщений
- render_progress_bar() для индикатора воспроизведения
- Hint "[Space] Воспроизвести" если не играет
- Footer с управлением
- Отображение доступных команд при воспроизведении
- "[Space] Play/Pause [s] Stop [←/→] Seek [↑/↓] Volume"
- Waveform визуализация (опционально)
- Конвертация waveform данных из Telegram в ASCII bars
- Использование символов ▁▂▃▄▅▆▇█ для визуализации
Этап 4: Хоткеи для управления [TODO]
- Новые команды
- PlayVoice - Space в режиме выбора голосового
- PauseVoice - Space во время воспроизведения
- StopVoice - s / ы
- SeekBackward - ← (перемотка назад на 5 сек)
- SeekForward - → (перемотка вперед на 5 сек)
- VolumeUp - ↑ (увеличить на 10%)
- VolumeDown - ↓ (уменьшить на 10%)
- Контекстная обработка
- Space работает как play/pause в зависимости от состояния
- ← / → для seek только во время воспроизведения
- ↑ / ↓ для громкости только во время воспроизведения
- Поддержка русской раскладки
- s / ы - stop
- Остальные клавиши универсальны (Space, стрелки)
Этап 5: Конфигурация и UX [TODO]
- AudioConfig в config.toml
- enabled: bool - включить/отключить аудио
- default_volume: f32 - громкость по умолчанию (0.0 - 1.0)
- seek_step_seconds: i32 - шаг перемотки в секундах
- autoplay: bool - автовоспроизведение при выборе
- cache_size_mb: usize - размер кэша голосовых
- show_waveform: bool - показывать waveform визуализацию
- system_player_fallback: bool - использовать системный плеер
- system_player: String - команда системного плеера (mpv, ffplay)
- Асинхронная загрузка
- Не блокировать UI во время загрузки файла
- Индикатор загрузки с процентами
- Возможность отмены загрузки
- Обновление UI
- Ticker для обновления progress bar (каждые 100ms)
- Плавное обновление позиции воспроизведения
- Автоматическая остановка при достижении конца
Этап 6: Обработка ошибок [TODO]
- Graceful fallback на системный плеер
- Если rodio не работает - использовать mpv/ffplay
- Логирование ошибок через tracing
- Предупреждение пользователю если аудио недоступно
- Обработка ошибок загрузки
- Таймаут загрузки (30 сек)
- Повторная попытка по запросу
- Сообщение об ошибке в UI
- Ограничения
- Максимальный размер файла для кэша
- Автоматическая очистка старых файлов
- Предупреждение для очень длинных голосовых (>5 мин)
Этап 7: Дополнительные улучшения [TODO]
- Управление воспроизведением
- Автоматическая остановка при закрытии чата
- Сохранение позиции при паузе
- Автопереход к следующему голосовому (опционально)
- Оптимизация
- Lazy loading (загрузка только при воспроизведении)
- Префетчинг следующего голосового (опционально)
- Минимальная задержка при нажатии Play
- Визуальные улучшения
- Анимация progress bar
- Цветовая индикация статуса (зеленый - playing, желтый - paused)
- Иконки в зависимости от статуса
Технические детали
- Аудио библиотека:
- rodio 0.17 (Pure Rust, кроссплатформенная)
- Поддержка OGG Opus (формат голосовых в Telegram)
- Контроль воспроизведения через Sink API
- Платформы:
- Linux (ALSA, PulseAudio)
- macOS (CoreAudio)
- Windows (WASAPI)
- Fallback:
- mpv --no-video (универсальный плеер)
- ffplay -nodisp (из ffmpeg)
- Новые хоткеи:
Space- воспроизвести/пауза (в режиме выбора голосового)s/ы- остановить воспроизведение←/→- перемотка -5с / +5с (во время воспроизведения)↑/↓- громкость +/- 10% (во время воспроизведения)
Фаза 13: Глубокий рефакторинг архитектуры [PLANNED]
Мотивация: Код вырос до критических размеров - некоторые файлы содержат >1000 строк, что затрудняет поддержку и навигацию. Необходимо разбить монолитные файлы на логические модули.
Проблемы:
src/input/main_input.rs- 1199 строк (самый большой файл!)src/app/mod.rs- 1015 строк, 116 функций (God Object)src/ui/messages.rs- 893 строкиsrc/tdlib/messages.rs- 833 строкиsrc/config/mod.rs- 642 строки
Этап 1: Разбить input/main_input.rs (1199 → <200 строк) [DONE ✅]
Текущая проблема:
- Весь input handling в одном файле
- Функции по 300-400 строк
- Невозможно быстро найти нужный handler
План:
- Создать
src/input/handlers/директорию - Создать
handlers/chat.rs- обработка ввода в открытом чате- Переместить
handle_open_chat_keyboard_input() - Обработка скролла, выбора сообщений
- 452 строки (7 функций)
- Переместить
- Создать
handlers/chat_list.rs- обработка в списке чатов- Переместить
handle_chat_list_keyboard_input() - Навигация по чатам, папки
- 142 строки (3 функции)
- Переместить
- Создать
handlers/compose.rs- режимы edit/reply/forward- Обработка ввода в режимах редактирования
- Input field управление (курсор, backspace, delete)
- 80 строк (2 функции)
- Создать
handlers/modal.rs- модалки- Delete confirmation
- Emoji picker
- Profile modal
- 316 строк (5 функций)
- Создать
handlers/search.rs- поиск- Search mode в чате
- Search mode в списке чатов
- 140 строк (3 функций)
- Обновить
main_input.rs- только роутинг- Определение текущего режима
- Делегация в нужный handler
- 164 строки (2 функции)
Результат: 1199 строк → 164 строки (удалено 1035 строк, -86%)
- Создано 5 новых модулей обработки ввода
- Чистый router pattern в main_input.rs
- Каждый handler отвечает за свою область
- Дополнительно: Исправлен конфликт Ctrl+I → Ctrl+U для профиля
Этап 2: Уменьшить app/mod.rs (116 функций → traits) [DONE ✅]
Текущая проблема:
- God Object с 116 функциями
- Сложно найти нужный метод
- Нарушение Single Responsibility Principle
План:
- Создать
app/methods/директорию - Создать trait
NavigationMethodsnext_chat(),previous_chat(),select_current_chat(),close_chat()next_filtered_chat(),previous_filtered_chat(),select_filtered_chat()- 7 методов
- Создать trait
MessageMethodsstart_message_selection(),select_previous/next_message()get_selected_message(),start_editing_selected(),cancel_editing()is_editing(),is_selecting_message()- 8 методов
- Создать trait
ComposeMethodsstart_reply_to_selected(),cancel_reply(),is_replying(),get_replying_to_message()start_forward_selected(),cancel_forward(),is_forwarding(),get_forwarding_message()get_current_draft(),load_draft()- 10 методов
- Создать trait
SearchMethods- Chat search:
start_search(),cancel_search(),get_filtered_chats() - Message search:
enter/exit_message_search_mode(),set/get_search_results() - Navigation:
select_previous/next_search_result(), query управление - 15 методов
- Chat search:
- Создать trait
ModalMethods- Delete confirmation:
is_confirm_delete_shown() - Pinned:
is/enter/exit_pinned_mode(),select_previous/next_pinned(), getters - Profile:
is/enter/exit_profile_mode(), navigation, leave_group confirmation - Reactions:
is/enter/exit_reaction_picker_mode(),select_previous/next_reaction() - 27 методов
- Delete confirmation:
- Оставить в
app/mod.rsтолько:- Struct definition
- Constructors (new, with_client)
- Utilities (get_command, get_selected_chat_id, get_selected_chat)
- Getters/setters для всех полей
- ~48 методов
Структура:
// app/mod.rs - только core
mod methods;
pub use methods::*;
impl<T: TdClientTrait> App<T> {
pub fn new() -> Self { ... }
pub fn get_command(...) -> Option<Command> { ... }
pub fn get_selected_chat_id(&self) -> Option<i64> { ... }
// ... getters/setters ...
}
// app/methods/navigation.rs
pub trait NavigationMethods<T: TdClientTrait> {
fn next_chat(&mut self);
fn previous_chat(&mut self);
}
impl<T: TdClientTrait> NavigationMethods<T> for App<T> { ... }
Результат: 1015 строк → 371 строка (удалено 644 строки, -63%)
- 116 функций → 5 trait impl блоков (67 методов в traits + 48 в core)
- Каждый trait отвечает за свою область функциональности
- Соблюдён Single Responsibility Principle ✅
Этап 3: Разбить ui/messages.rs (893 → <300 строк) [TODO]
Текущая проблема:
- Весь UI рендеринг сообщений в одном файле
- Модалки смешаны с основным рендерингом
- Compose bar (input field) в том же файле
План:
- Создать
ui/modals/директорию - Создать
modals/delete_confirm.rs- Рендеринг модалки подтверждения удаления
- Обработка y/n input
- ~50 строк
- Создать
modals/emoji_picker.rs- Рендеринг сетки эмодзи
- Навигация по сетке
- ~100 строк
- Создать
modals/search_modal.rs- Поиск в чате
- Подсветка результатов
- Навигация по совпадениям
- ~80 строк
- Создать
modals/profile_modal.rs- Профиль пользователя/чата
- Отображение информации
- ~100 строк
- Создать
ui/compose_bar.rs- Поле ввода сообщения
- Превью для edit/reply/forward
- Курсор, автоматический wrap
- ~150 строк
- Оставить в
messages.rs:- Основной layout сообщений
- Рендеринг списка message bubbles
- Группировка по дате
- Pinned message
- ~300 строк
Результат: 893 строки → 6 файлов по <150 строк
Этап 4: Разбить tdlib/messages.rs (833 → 2 файла) [TODO]
Текущая проблема:
- Смешивается конвертация из TDLib и операции
- Большой файл сложно читать
План:
- Создать
tdlib/messages/директорию - Создать
messages/convert.rs- Конвертация MessageContent из TDLib
- Парсинг всех типов (Text, Photo, Video, Voice, etc.)
- Обработка форматирования (entities)
- ~500 строк
- Создать
messages/operations.rs- send_message(), edit_message(), delete_message()
- forward_message(), reply_to_message()
- get_chat_history(), load_older_messages()
- ~300 строк
- Обновить
tdlib/messages.rs→tdlib/messages/mod.rs- Re-export публичных типов
- ~30 строк
Результат: 833 строки → 2 файла по <500 строк
Этап 5: Разбить config/mod.rs (642 → 3 файла) [TODO]
Текущая проблема:
- Много default_* функций (по 1-3 строки каждая)
- Validation logic смешана с определениями
- Сложно найти нужную секцию конфига
План:
- Создать
config/defaults.rs- Все default_* функции
- ~100 строк
- Создать
config/validation.rs- Валидация timezone
- Валидация цветов
- Валидация notification settings
- ~150 строк
- Создать
config/loader.rs- Загрузка из файла
- Поиск путей (XDG, home, etc.)
- Обработка ошибок чтения
- ~100 строк
- Оставить в
config/mod.rs:- Struct definitions
- Default impls (вызывают defaults.rs)
- Re-exports
- ~200-300 строк
Результат: 642 строки → 4 файла по <200 строк
Этап 6: Code Duplication Cleanup [TODO]
План:
- Найти дублированный код в handlers
- Общая логика обработки клавиш
- Вынести в
input/common.rs
- Найти дублированный код в UI
- Общие компоненты рендеринга
- Вынести в
ui/components/
- Использовать DRY принцип везде
Этап 7: Documentation Update [TODO]
План:
- Обновить CONTEXT.md с новой структурой
- Обновить PROJECT_STRUCTURE.md
- Добавить module-level документацию
- Создать architecture diagram (ASCII)
Метрики успеха
До рефакторинга:
input/main_input.rs: 1199 строк
app/mod.rs: 1015 строк (116 функций)
ui/messages.rs: 893 строки
tdlib/messages.rs: 833 строки
config/mod.rs: 642 строки
ИТОГО: 4582 строки в 5 файлах
После рефакторинга:
input/handlers/*.rs: ~6 файлов по <400 строк
app/methods/*.rs: ~6 traits с impl блоками
ui/modals/*.rs: ~4 файла по <150 строк
tdlib/messages/*.rs: 2 файла по <500 строк
config/*.rs: 4 файла по <200 строк
ИТОГО: те же строки, но в ~20+ файлах
Преимущества:
- ✅ Легче найти нужный код
- ✅ Легче тестировать модули
- ✅ Меньше конфликтов при работе в команде
- ✅ Лучше читаемость и поддерживаемость
- ✅ Соблюдение Single Responsibility Principle