4.2 KiB
4.2 KiB
Структура проекта
Карта подсистем без полного дерева файлов.
Поток данных
TDLib updates -> mpsc channel -> App state -> UI render
User input -> input handlers -> App methods -> TdClientTrait -> TDLib API
crates/tele-tui/src/main.rs держит event loop: клавиатура, TDLib updates,
фоновые задачи и отрисовка по needs_redraw.
Подсистемы
| Путь | Назначение |
|---|---|
crates/tele-core/src/tdlib/ |
TDLib wrapper: auth, chats, users, reactions, updates, conversion, operations |
crates/tele-core/src/types.rs |
Shared typed IDs |
crates/tele-core/src/message_grouping.rs |
Pure message grouping |
crates/tele-core/src/accounts/ |
Pure account profile types and validation |
crates/tele-core/src/test_support/ |
Reusable FakeTdClient and TDLib test data |
crates/tele-tui/src/app/ |
Центральное состояние App<T: TdClientTrait>, экраны, режимы и modal state |
crates/tele-tui/src/app/methods/ |
Trait-based методы navigation/messages/compose/search/modal |
crates/tele-tui/src/input/ |
Роутинг клавиатуры и обработчики global/chat/compose/modal/search |
crates/tele-tui/src/ui/ |
Отрисовка экранов, списка чатов, сообщений, footer, compose bar и модалок |
crates/tele-tui/src/config/ |
TOML config, credentials, keybindings, validation |
crates/tele-tui/src/accounts/ |
accounts.toml, migration, account data paths, per-account lock files |
crates/tele-tui/src/audio/ |
Голосовые сообщения через ffplay и VoiceCache |
crates/tele-tui/src/media/ |
Inline images и modal viewer под feature images |
crates/tele-tui/src/notifications.rs |
Desktop notification delivery and muted-chat syncing |
crates/tele-tui/src/utils/ |
Форматирование, validation, retry, TDLib log helpers |
State
ChatState описывает режим открытого чата: normal selection, editing, reply, forward, delete confirmation, reaction picker, profile, search, pinned messages.
Отдельно есть InputMode: в Normal mode работают команды, в Insert mode вводится текст.
TDLib слой
TdClientTraitзадаёт API для приложения и тестов.- Реальный клиент живёт в
TdClient, тесты используютFakeTdClient. - Updates должны фильтроваться по активному
client_id, особенно для мультиаккаунта. TdClientне зависит от desktop notifications. Он отдаёт входящие сообщения черезdrain_incoming_message_events(), аtele-tuiрешает, показывать ли desktop notification.
Тесты
| Область | Где искать |
|---|---|
| Core unit tests | crates/tele-core/src/** |
| Test builders и fake TDLib | crates/tele-core/src/test_support/, crates/tele-tui/src/test_support/, crates/tele-tui/tests/helpers/ |
| Snapshot UI | crates/tele-tui/tests/* + crates/tele-tui/tests/snapshots/ |
| Навигация и ввод | crates/tele-tui/tests/input_navigation.rs, crates/tele-tui/tests/vim_mode.rs, crates/tele-tui/tests/navigation.rs |
| Аккаунты | crates/tele-tui/tests/accounts.rs, crates/tele-tui/tests/account_switcher.rs |
| User journeys | crates/tele-tui/tests/e2e_smoke.rs, crates/tele-tui/tests/e2e_user_journey.rs |
Runtime-файлы
| Путь | Назначение |
|---|---|
~/.config/tele-tui/config.toml |
Пользовательская конфигурация |
~/.config/tele-tui/credentials |
API_ID и API_HASH |
~/.config/tele-tui/accounts.toml |
Список аккаунтов |
~/.local/share/tele-tui/accounts/{name}/tdlib_data/ |
TDLib database аккаунта |
~/.local/share/tele-tui/accounts/{name}/tele-tui.lock |
Lock активного аккаунта |
~/.cache/tele-tui/voice/ |
Кэш голосовых сообщений |