# Структура проекта Карта подсистем без полного дерева файлов. ## Поток данных ```text 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`, экраны, режимы и 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/` | Кэш голосовых сообщений |