Files
telegram-tui/CONTEXT.md
Mikhail Kilin 7081a886ad refactor: implement newtype pattern for IDs (P2.4)
Добавлены типобезопасные обёртки ChatId, MessageId, UserId для предотвращения
смешивания разных типов идентификаторов на этапе компиляции.

Изменения:
- Создан src/types.rs с тремя newtype структурами
- Реализованы методы: new(), as_i64(), From<i64>, Display
- Добавлены traits: Hash, Eq, Serialize, Deserialize
- Обновлены 15+ модулей для использования новых типов:
  * tdlib: types.rs, chats.rs, messages.rs, users.rs, reactions.rs, client.rs
  * app: mod.rs, chat_state.rs
  * input: main_input.rs
  * tests: app_builder.rs, test_data.rs
- Исправлены 53 ошибки компиляции связанные с type conversions

Преимущества:
- Компилятор предотвращает смешивание разных типов ID
- Улучшенная читаемость кода (явные типы вместо i64)
- Самодокументирующиеся типы

Статус: Priority 2 теперь 60% (3/5 задач)
-  Error enum
-  Config validation
-  Newtype для ID
-  MessageInfo реструктуризация
-  MessageBuilder pattern

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-31 01:33:18 +03:00

33 KiB
Raw Blame History

Текущий контекст проекта

Статус: Фаза 9 — ЗАВЕРШЕНО + Тестирование (100%!) 🎉

Что сделано

TDLib интеграция

  • Подключена библиотека tdlib-rs v1.1 с автоматической загрузкой TDLib
  • Реализована авторизация через телефон + код + 2FA пароль
  • Сессия сохраняется автоматически в папке tdlib_data/
  • Отключены логи TDLib через FFI вызов td_execute до создания клиента
  • Updates обрабатываются в отдельном потоке через mpsc канал (неблокирующе)
  • Graceful shutdown: корректное закрытие TDLib при выходе (Ctrl+C)

Функциональность

  • Загрузка списка чатов (до 50 штук)
  • Фильтрация чатов: показываются только чаты из ChatList::Main (без архива)
  • Фильтрация удалённых аккаунтов: "Deleted Account" не отображаются в списке
  • Отображение названия чата, счётчика непрочитанных и @username
  • Иконка 📌 для закреплённых чатов
  • Иконка 🔇 для замьюченных чатов
  • Индикатор @ для чатов с непрочитанными упоминаниями
  • Онлайн-статус: зелёная точка ● для онлайн пользователей
  • Загрузка истории сообщений при открытии чата (множественные попытки)
  • Группировка сообщений по дате (разделители "Сегодня", "Вчера", дата) — по центру
  • Группировка сообщений по отправителю (заголовок с именем)
  • Выравнивание сообщений: исходящие справа (зелёные), входящие слева
  • Перенос длинных сообщений: автоматический wrap на несколько строк
  • Отображение времени и галочек: текст (HH:MM ✓✓) для исходящих, (HH:MM) текст для входящих
  • Галочки прочтения (✓ отправлено, ✓✓ прочитано) — обновляются в реальном времени
  • Отметка сообщений как прочитанных: при открытии чата счётчик непрочитанных сбрасывается
  • Отправка текстовых сообщений
  • Редактирование сообщений: ↑ при пустом инпуте → выбор → Enter → редактирование
  • Удаление сообщений: в режиме выбора нажать d / в / Delete → модалка подтверждения
  • Reply на сообщения: в режиме выбора нажать r / к → режим ответа с превью
  • Forward сообщений: в режиме выбора нажать f / а → выбор чата для пересылки
  • Отображение пересланных сообщений: индикатор "↪ Переслано от" с именем отправителя
  • Индикатор редактирования: ✎ рядом с временем для отредактированных сообщений
  • Новые сообщения в реальном времени при открытом чате
  • Поиск по чатам (Ctrl+S): фильтрация по названию и @username
  • Typing indicator ("печатает..."): отображение статуса набора текста собеседником и отправка своего статуса
  • Закреплённые сообщения: отображение pinned message вверху чата с переходом к нему
  • Поиск по сообщениям в чате (Ctrl+F): поиск текста внутри открытого чата с навигацией по результатам
  • Черновики: автосохранение набранного текста при переключении между чатами
  • Профиль пользователя/чата (i): просмотр информации о собеседнике или группе
  • Копирование сообщений (y/н): копирование текста сообщения в системный буфер обмена
  • Реакции на сообщения:
    • Отображение реакций под сообщениями
    • Логика отображения: 1 человек = только emoji, 2+ = emoji + счётчик
    • Свои реакции в рамках [👍], чужие без рамок 👍
    • Emoji picker с сеткой доступных реакций (8 в ряду)
    • Добавление/удаление реакций (toggle)
    • Обновление реакций в реальном времени через Update::MessageInteractionInfo
  • Конфигурационный файл (~/.config/tele-tui/config.toml):
    • Автоматическое создание дефолтного конфига при первом запуске
    • Настройка timezone: формат "+03:00" или "-05:00"
    • Настройка цветов: incoming_message, outgoing_message, selected_message, reaction_chosen, reaction_other
    • Credentials файл (~/.config/tele-tui/credentials): API_ID и API_HASH
    • Приоритет загрузки: ~/.config/tele-tui/credentials → .env → сообщение об ошибке с инструкциями
  • Кеширование имён пользователей: имена загружаются асинхронно и обновляются в UI
  • Папки Telegram: загрузка и переключение между папками (1-9)
  • Медиа-заглушки: [Фото], [Видео], [Голосовое], [Стикер], [GIF] и др.
  • Markdown форматирование в сообщениях:
    • Жирный (bold)
    • Курсив (italic)
    • Подчёркнутый (underline)
    • Зачёркнутый (strikethrough)
    • Код (inline code, Pre, PreCode) — cyan на тёмном фоне
    • Спойлеры — скрытый текст (серый на сером)
    • Ссылки (URL, TextUrl, Email, Phone) — синий с подчёркиванием
    • @Упоминания — синий с подчёркиванием

Состояние сети

  • Индикатор в футере: показывает текущее состояние подключения
    • ⚠ Нет сети — красный, ожидание сети
    • ⏳ Прокси... — cyan, подключение к прокси
    • ⏳ Подключение... — cyan, подключение к серверам
    • ⏳ Обновление... — cyan, синхронизация данных

Оптимизации

  • 60 FPS ready: poll таймаут 16ms, рендеринг только при изменениях (needs_redraw флаг)
  • Оптимизация памяти:
    • Очистка сообщений при закрытии чата
    • Лимит кэша пользователей (500)
    • Периодическая очистка неактивных записей
  • Минимальное разрешение: предупреждение если терминал меньше 80x20

Динамический инпут

  • Автоматическое расширение: поле ввода увеличивается при длинном тексте (до 10 строк)
  • Перенос текста: длинные сообщения переносятся на новые строки
  • Блочный курсор: vim-style курсор █ с возможностью перемещения по тексту

Управление

  • ↑/↓ стрелки — навигация по списку чатов
  • Enter — открыть чат / отправить сообщение
  • Esc — закрыть открытый чат / отменить поиск
  • Ctrl+S — поиск по чатам (фильтрация по названию и username)
  • Ctrl+R — обновить список чатов
  • Ctrl+C — выход (graceful shutdown)
  • ↑/↓ в открытом чате — скролл сообщений (с подгрузкой старых)
  • при пустом инпуте — выбор сообщения для редактирования
  • Enter в режиме выбора — начать редактирование
  • r / к в режиме выбора — ответить на сообщение (reply)
  • f / а в режиме выбора — переслать сообщение (forward)
  • d / в / Delete в режиме выбора — удалить сообщение (с подтверждением)
  • y / н / Enter — подтвердить удаление в модалке
  • n / т / Esc — отменить удаление в модалке
  • Esc — отменить выбор/редактирование/reply
  • 1-9 — переключение папок (в списке чатов)
  • Ctrl+F — поиск по сообщениям в открытом чате
  • n / N — навигация по результатам поиска (следующий/предыдущий)
  • i — открыть профиль пользователя/чата
  • y / н в режиме выбора — скопировать сообщение в буфер обмена
  • e / у в режиме выбора — добавить реакцию (открывает emoji picker)
  • / / / в emoji picker — навигация по сетке реакций
  • Enter в emoji picker — добавить/удалить реакцию
  • Esc в emoji picker — закрыть picker
  • Редактирование текста в инпуте:
    • / — перемещение курсора
    • Home — курсор в начало
    • End — курсор в конец
    • Backspace — удалить символ слева
    • Delete — удалить символ справа

Структура проекта

src/
├── main.rs           # Точка входа, event loop, TDLib инициализация, graceful shutdown
├── lib.rs            # Библиотечный интерфейс (для тестов)
├── types.rs          # Типобезопасные обёртки (ChatId, MessageId, UserId)
├── config.rs         # Конфигурация (TOML), загрузка credentials
├── app/
│   ├── mod.rs        # App структура и состояние (needs_redraw флаг)
│   └── state.rs      # AppScreen enum
├── ui/
│   ├── mod.rs        # Роутинг UI по экранам, проверка минимального размера
│   ├── loading.rs    # Экран загрузки
│   ├── auth.rs       # Экран авторизации
│   ├── main_screen.rs # Главный экран с папками
│   ├── chat_list.rs  # Список чатов (pin, mute, online, mentions)
│   ├── messages.rs   # Область сообщений (wrap, группировка, динамический инпут)
│   └── footer.rs     # Подвал с командами и статусом сети
├── input/
│   ├── mod.rs        # Роутинг ввода
│   ├── auth.rs       # Обработка ввода на экране авторизации
│   └── main_input.rs # Обработка ввода на главном экране
├── utils.rs          # Утилиты (disable_tdlib_logs, format_timestamp_with_tz, format_date, get_day)
└── tdlib/
    ├── mod.rs        # Модуль экспорта (TdClient, UserOnlineStatus, NetworkState)
    ├── client.rs     # TdClient: авторизация, chats, messages, users, reactions
    ├── auth.rs       # AuthManager + AuthState enum
    ├── chats.rs      # ChatManager для операций с чатами
    ├── messages.rs   # MessageManager для сообщений
    ├── users.rs      # UserCache с LRU кэшем
    ├── reactions.rs  # ReactionManager
    └── types.rs      # Общие типы данных (ChatInfo, MessageInfo, etc.)

tests/
├── helpers/
│   ├── mod.rs          # Экспорт тестовых утилит
│   ├── app_builder.rs  # TestAppBuilder для создания тестовых App
│   ├── fake_tdclient.rs # FakeTdClient (mock TDLib клиент, для будущих интеграционных тестов)
│   ├── snapshot_utils.rs # Утилиты для snapshot тестов (render_to_buffer, buffer_to_string)
│   └── test_data.rs    # Builders для тестовых данных (TestChatBuilder, TestMessageBuilder)
├── chat_list.rs        # Snapshot тесты для списка чатов (9 тестов)
└── messages.rs         # Snapshot тесты для сообщений (19 тестов)

Тестирование

Статус: ЗАВЕРШЕНО! (100%) — Все тесты готовы! 🎉🎊

Стратегия: Комбо подход — 70% snapshot tests, 25% integration tests, 5% e2e smoke tests

Инфраструктура (Фаза 0): Завершена

  • Добавлены зависимости: insta = "1.34", tokio-test = "0.4"
  • Создан src/lib.rs для экспорта модулей в тесты
  • Созданы test helpers:
    • TestAppBuilder — fluent builder для создания тестовых App
    • TestChatBuilder / TestMessageBuilder — builders для тестовых данных
    • FakeTdClient — in-memory mock TDLib клиента
    • render_to_buffer / buffer_to_string — утилиты для snapshot тестов

Snapshot Tests (Фаза 1): 55/55 (100%)

  • 1.1 Chat List (9/9): пустой список, множественные чаты, unread, pinned, muted, mentions, selected, long title, search mode
  • 1.2 Messages (18/18): empty chat, incoming/outgoing, date separators, sender grouping, read receipts, edited, long message wrap, markdown, media, reply, forwarded, reactions
  • 1.3 Modals (8/8): delete confirmation, emoji picker, profile, pinned message, search, forward
  • 1.4 Input Field (7/7): empty, text, long text, editing/reply/search modes
  • 1.5 Footer (6/6): chat list, open chat, network states, search mode
  • 1.6 Screens (7/7): loading, auth, main, terminal size warning

Integration Tests (Фаза 2): 93/93 (100%!)

  • 2.1 Send Message Flow (6/6): отправка текста, множественные, форматирование, разные чаты, входящие, reply
  • 2.2 Edit Message Flow (6/6): изменение текста, edit_date, can_be_edited, только свои, множественные, форматирование
  • 2.3 Delete Message Flow (6/6): удаление из списка, множественные, can_be_deleted, только свои, разные чаты, revoke
  • 2.4 Reply & Forward Flow (8/8): reply с превью, связь с оригиналом, forward с sender, разные чаты, комбо
  • 2.5 Reactions Flow (10/10): добавление, toggle, множественные, разные юзеры, подсчёт, chosen, realtime, доступные, на forwarded, очистка
  • 2.6 Search Flow (8/8): по названию, username, сообщениям, навигация, case-insensitive, пробелы, пустой, очистка
  • 2.7 Drafts Flow (7/7): сохранение, восстановление, удаление, независимые, индикатор, пустой, закрытие чата
  • 2.8 Navigation Flow (7/7): списку чатов, открытие, закрытие, скролл, папки, wrap, пустой список
  • 2.9 Profile Flow (6/6): личный чат, имя+username, телефон, группа, участники, закрытие
  • 2.10 Network & Typing Flow (9/9): typing indicator, action, статус, timeout, network states (5)
  • 2.11 Copy Flow (9/9): форматирование plain, forward, reply, оба контекста, длинные, markdown, clipboard init, clipboard test, кроссплатформенность
  • 2.12 Config Flow (11/11): дефолты, кастомные, валидные цвета, light цвета, невалидные (fallback), case-insensitive, TOML сериализация, частичный TOML, timezone форматы, credentials из env, credentials ошибка

Прогресс: 148/151 тестов (98%) — больше чем планировалось!

ВСЕ ТЕСТЫ ЗАВЕРШЕНЫ! 🎉 Phase 0, 1, 2 — готово!

Подробный план и roadmap: см. TESTING_ROADMAP.md

Ключевые решения

  1. Неблокирующий receive: TDLib updates приходят в отдельном потоке и передаются в main loop через mpsc::channel. Это позволяет UI оставаться отзывчивым.

  2. FFI для логов: Используем прямой вызов td_execute для отключения логов синхронно, до создания клиента, чтобы избежать вывода в терминал.

  3. Синхронизация чатов: Чаты загружаются асинхронно через updates. Main loop периодически синхронизирует app.chats с td_client.chats.

  4. Кеширование имён: При получении Update::User сохраняем имя (first_name + last_name) и username в HashMap. Имена подгружаются асинхронно через очередь pending_user_ids. Кэш ограничен 500 записями.

  5. Группировка сообщений: Сообщения группируются по дате (разделители по центру) и по отправителю (заголовки). Исходящие выравниваются вправо, входящие влево.

  6. Отметка прочтения: При открытии чата вызывается view_messages для всех сообщений. Новые входящие сообщения автоматически отмечаются как прочитанные. Update::ChatReadOutbox обновляет статус галочек.

  7. Graceful shutdown: При Ctrl+C устанавливается флаг остановки, закрывается TDLib клиент, ожидается завершение polling задачи с таймаутом 2 сек.

  8. Оптимизация рендеринга: Флаг needs_redraw позволяет пропускать перерисовку когда ничего не изменилось. Триггеры: TDLib updates, пользовательский ввод, изменение размера терминала.

  9. Перенос текста: Длинные сообщения автоматически разбиваются на строки с учётом ширины терминала. Для исходящих — time_mark на последней строке, для входящих — время на первой строке с отступом для остальных.

  10. Конфигурационный файл: TOML конфиг создаётся автоматически при первом запуске в ~/.config/tele-tui/config.toml. Поддерживает настройку timezone (применяется к отображению времени через format_timestamp_with_tz) и цветовой схемы (парсится в ratatui::style::Color). Credentials загружаются с приоритетом: XDG config dir → .env → ошибка с инструкциями.

  11. Реакции: Хранятся в Vec<ReactionInfo> для каждого сообщения. Обновляются в реальном времени через Update::MessageInteractionInfo. Emoji picker использует сетку 8x6 с навигацией стрелками. Приоритет обработки ввода: reaction picker → delete confirmation → остальные модалки (важно для корректной работы Enter/Esc).

Зависимости (Cargo.toml)

ratatui = "0.29"
crossterm = "0.28"
tdlib-rs = { version = "1.1", features = ["download-tdlib"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
dotenvy = "0.15"
chrono = "0.4"
clipboard = "0.5"
toml = "0.8"
dirs = "5.0"

API Credentials

Приоритет загрузки (от высшего к низшему):

  1. Файл credentials (~/.config/tele-tui/credentials):
API_ID=your_api_id
API_HASH=your_api_hash
  1. Переменные окружения (.env файл в текущей директории):
API_ID=your_api_id
API_HASH=your_api_hash
  1. Если ничего не найдено — показывается сообщение об ошибке с инструкциями.

Конфигурационный файл

Создаётся автоматически при первом запуске в ~/.config/tele-tui/config.toml:

[general]
# Часовой пояс в формате "+03:00" или "-05:00"
# Применяется к отображению времени сообщений
timezone = "+03:00"

[colors]
# Цветовая схема (поддерживаемые цвета: black, red, green, yellow, blue, magenta, cyan, gray, white, darkgray, lightred, lightgreen, lightyellow, lightblue, lightmagenta, lightcyan)

# Цвет входящих сообщений
incoming_message = "white"

# Цвет исходящих сообщений
outgoing_message = "green"

# Цвет выбранного сообщения
selected_message = "yellow"

# Цвет своих реакций (в рамках [👍])
reaction_chosen = "yellow"

# Цвет чужих реакций
reaction_other = "gray"

Последние обновления (2026-01-31)

Рефакторинг — Priority 2 продолжается! 🏗️

P2.4 — Newtype pattern для ID ЗАВЕРШЕНО!

Что сделано:

  • Создан src/types.rs с типобезопасными обёртками для идентификаторов
  • Реализованы три типа: ChatId(i64), MessageId(i64), UserId(i64)
  • Добавлены методы: new(), as_i64(), From<i64>, Display, Hash, Eq, Serialize/Deserialize
  • Обновлены 15+ модулей для использования новых типов
  • Исправлены 53 ошибки компиляции связанные с type conversions
  • Компилятор теперь предотвращает смешивание разных типов ID на этапе компиляции

Модули обновлены:

  • tdlib/types.rs — ChatInfo, MessageInfo, ReplyInfo, ProfileInfo
  • tdlib/chats.rs — все методы с chat_id параметрами
  • tdlib/messages.rs — MessageManager, pending_view_messages
  • tdlib/users.rs — LruCache, UserCache mappings
  • tdlib/reactions.rs — reaction methods
  • tdlib/client.rs — все публичные методы и Update handlers
  • app/mod.rs — selected_chat_id
  • app/chat_state.rs — все варианты ChatState
  • input/main_input.rs — обработка ввода с преобразованием типов
  • Test helpers — TestAppBuilder, TestChatBuilder, TestMessageBuilder

Преимущества:

  • 🛡️ Type safety на уровне компиляции — невозможно перепутать ChatId, MessageId, UserId
  • 🔍 Улучшенная читаемость кода — явные типы вместо i64
  • 🐛 Меньше ошибок — компилятор ловит проблемы до запуска
  • 📚 Лучшая документация — типы самодокументируются

Статус Priority 2: 60% (3/5 задач)

  • Error enum
  • Config validation
  • Newtype для ID
  • MessageInfo реструктуризация
  • MessageBuilder pattern

Тестирование — ЗАВЕРШЕНО! 🎉🎊🚀 (2026-01-30)

Добавлено:

  • 📝 93 integration теста (12 файлов): send_message, edit_message, delete_message, reply_forward, reactions, search, drafts, navigation, profile, network_typing, copy, config
  • 🎯 Phase 2.1-2.10 (73 теста)
  • 🎯 Phase 2.11 Copy Flow (9 тестов) НОВОЕ!
    • Форматирование сообщений (plain, forward, reply, комбо, длинные, markdown)
    • Clipboard тесты (инициализация, реальное копирование, кроссплатформенность)
  • 🎯 Phase 2.12 Config Flow (11 тестов) НОВОЕ!
    • Config дефолты и кастомные значения
    • Парсинг цветов (валидные, light, невалидные с fallback, case-insensitive)
    • TOML сериализация/десериализация
    • Timezone форматы
    • Credentials загрузка (из env, проверка ошибок)
  • 📚 Обновлена документация тестирования (TESTING_PROGRESS.md, TESTING_ROADMAP.md, CONTEXT.md)

Покрытие: 148/151 тестов (98%) — БОЛЬШЕ ЧЕМ ПЛАНИРОВАЛОСЬ! 🎉

  • Phase 0: Инфраструктура (100%)
  • Phase 1: UI Snapshot Tests (100%) - 55 тестов
  • Phase 2: Integration Tests (100%!) - 93 тестов (вместо запланированных 84!)
    • Copy Flow: 9 тестов (вместо 3)
    • Config Flow: 11 тестов (вместо 8)

Все тесты проходят: cargo test → 148+ passed

Статус: ВСЕ ОСНОВНЫЕ ТЕСТЫ ЗАВЕРШЕНЫ! Опциональные тесты (E2E smoke, utils, performance) можно сделать позже.

Подробности: TESTING_PROGRESS.md

Рефакторинг — Приоритет 1 ЗАВЕРШЁН! 🏗️ (2026-01-30)

Статус: Priority 1 (3/3 задач) ЗАВЕРШЕНО!

Завершено:

  • P1.3 — Константы (ранее)

    • Вынесены магические числа в src/constants.rs
    • Улучшена читаемость и maintainability
  • P1.2 — Разделение TdClient (2026-01-30)

    • Разделён монолитный TdClient (2036 строк, 87KB) на 7 модулей:
      • auth.rs — AuthManager + AuthState enum (6.8KB)
      • chats.rs — ChatManager для операций с чатами (8.1KB)
      • messages.rs — MessageManager для сообщений (18.5KB)
      • users.rs — UserCache с LRU кэшем (6.2KB)
      • reactions.rs — ReactionManager (4.2KB)
      • types.rs — Общие типы данных (10.8KB)
      • mod.rs — Экспорты модулей
    • Размер client.rs сократился на 50% (87KB → 42.5KB)
    • Исправлено 130+ ошибок компиляции из-за изменений в tdlib-rs API
    • Все 330 тестов проходят
  • P1.1 — ChatState enum (2026-01-30)

    • Схлопнуты 14 boolean полей в type-safe enum ChatState
    • Невозможно иметь несколько состояний одновременно
    • Данные состояния хранятся вместе с ним
    • Варианты: Normal, MessageSelection, Editing, Reply, Forward, DeleteConfirmation, ReactionPicker, Profile, SearchInChat, PinnedMessages
    • Обновлены все методы App для делегирования к ChatState
    • Все 330 тестов проходят

Преимущества:

  • Код стал более модульным и maintainable
  • Улучшена type-safety
  • Проще добавлять новые фичи
  • Лучше читаемость

Priority 2 (60% завершено - 3/5):

  • P2.5 — Error enum (завершено 2026-01-31)

    • Создан src/error.rs с типобезопасным enum TeletuiError
    • Добавлены варианты: TdLib, Config, Network, Auth, Chat, Message, User, InvalidTimezone, InvalidColor, Clipboard, Io, Toml, Json, Other
    • Type alias Result<T> для упрощения сигнатур
    • Использован thiserror для автоматического Display
    • Заменены все Result<T, String> на Result<T> в 7 модулях
    • Все 350 тестов проходят
  • P2.3 — Config validation (завершено 2026-01-31)

    • Добавлен метод Config::validate() для проверки конфигурации
    • Валидация timezone: проверка что начинается с + или -
    • Валидация цветов: проверка что цвет из списка допустимых (black, red, green, yellow, blue, magenta, cyan, gray, white, darkgray, lightred, lightgreen, lightyellow, lightblue, lightmagenta, lightcyan)
    • При загрузке невалидного конфига автоматически используется дефолтный
    • Все 350 тестов проходят
  • P2.4 — Newtype pattern для ID (завершено 2026-01-31)

    • Создан src/types.rs с типобезопасными обёртками: ChatId, MessageId, UserId
    • Реализованы методы: new(), as_i64(), From<i64>, Display, Hash, Eq, Serialize/Deserialize
    • Обновлены 15+ модулей для использования новых типов:
      • tdlib/types.rs: ChatInfo, MessageInfo, ReplyInfo, ProfileInfo
      • tdlib/chats.rs, tdlib/messages.rs, tdlib/users.rs, tdlib/reactions.rs
      • tdlib/client.rs: все методы и Update handlers
      • app/mod.rs, app/chat_state.rs
      • input/main_input.rs
      • Test helpers (app_builder, test_data)
    • Компилятор теперь предотвращает смешивание разных типов ID
    • Все тесты компилируются успешно

Следующие шаги: Priority 2 (MessageBuilder, реструктуризация MessageInfo)

Подробности: REFACTORING_ROADMAP.md

Что НЕ сделано / TODO

Все пункты Фазы 9 завершены! Можно переходить к следующей фазе разработки или продолжить написание тестов.

Технический долг

См. REFACTORING_ROADMAP.md для детального плана рефакторинга.

Завершено (Priority 1):

  1. ChatState enum — схлопнуты boolean состояния в type-safe enum
  2. Разделение TdClient — разделён на 7 модулей
  3. Константы — вынесены в отдельный модуль

Завершено (Priority 2):

  1. Error enum — типобезопасная обработка ошибок (2026-01-31)
  2. Config validation — валидация конфигурации при загрузке (2026-01-31)
  3. Newtype pattern для ID — типобезопасные обёртки ChatId, MessageId, UserId (2026-01-31)

В работе (Priority 2-5):

  1. MessageInfo реструктуризация — упрощение структуры сообщений
  2. MessageBuilder — упрощение создания сообщений
  3. UI компоненты — выделить переиспользуемые компоненты
  4. Форматирование — вынести markdown форматирование в отдельный модуль
  5. Юнит-тесты — добавить для utils и других модулей

Известные проблемы

  1. При первом запуске нужно пройти авторизацию