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>
This commit is contained in:
Mikhail Kilin
2026-01-31 01:33:18 +03:00
parent 38e73befc1
commit 7081a886ad
15 changed files with 458 additions and 177 deletions

View File

@@ -128,6 +128,7 @@
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 флаг)
@@ -147,7 +148,13 @@ src/
├── utils.rs # Утилиты (disable_tdlib_logs, format_timestamp_with_tz, format_date, get_day)
└── tdlib/
├── mod.rs # Модуль экспорта (TdClient, UserOnlineStatus, NetworkState)
── client.rs # TdClient: авторизация, чаты, сообщения, кеш, NetworkState, ReactionInfo
── 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/
@@ -290,9 +297,48 @@ reaction_chosen = "yellow"
reaction_other = "gray"
```
## Последние обновления (2026-01-30)
## Последние обновления (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<UserId>, 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**
@@ -357,7 +403,7 @@ reaction_other = "gray"
- Проще добавлять новые фичи
- Лучше читаемость
**Priority 2 (40% завершено - 2/5)**:
**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
@@ -373,7 +419,20 @@ reaction_other = "gray"
- При загрузке невалидного конфига автоматически используется дефолтный
- Все 350 тестов проходят ✅
**Следующие шаги**: Priority 2 (Newtype для ID, MessageBuilder, реструктуризация MessageInfo)
-**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](REFACTORING_ROADMAP.md)
@@ -393,9 +452,10 @@ reaction_other = "gray"
**Завершено** (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. **Типобезопасность** — newtype pattern для ID
1. **MessageInfo реструктуризация** — упрощение структуры сообщений
2. **MessageBuilder** — упрощение создания сообщений
3. **UI компоненты** — выделить переиспользуемые компоненты
4. **Форматирование** — вынести markdown форматирование в отдельный модуль