Files
telegram-tui/docs/PROJECT_STRUCTURE.md
2026-05-20 00:31:18 +03:00

4.2 KiB
Raw Permalink Blame History

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

Карта подсистем без полного дерева файлов.

Поток данных

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/ Кэш голосовых сообщений