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

@@ -145,34 +145,52 @@ pub const TDLIB_MESSAGE_LIMIT: i32 = 50;
## Приоритет 2: Улучшение типобезопасности
### 4. Newtype pattern для ID
### 4. Newtype pattern для ID ✅ ЗАВЕРШЕНО!
**Статус**: ЗАВЕРШЕНО (2026-01-31)
**Проблема**: Везде используется `i64` для `chat_id`, `message_id`, `user_id` — легко перепутать.
**Решение**: Создать `src/types.rs`:
**Решение**: ✅ Реализовано в `src/types.rs`:
```rust
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ChatId(pub i64);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct MessageId(pub i64);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct UserId(pub i64);
impl ChatId {
pub fn new(id: i64) -> Self { Self(id) }
pub fn as_i64(&self) -> i64 { self.0 }
}
impl From<i64> for ChatId {
fn from(id: i64) -> Self {
ChatId(id)
fn from(id: i64) -> Self { ChatId(id) }
}
impl Display for ChatId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
// Аналогично для MessageId и UserId
```
**Что сделано**:
- ✅ Создан `src/types.rs` с тремя типами: `ChatId`, `MessageId`, `UserId`
- ✅ Добавлены методы `new()`, `as_i64()`, `From<i64>`, `Display`
- ✅ Реализованы traits: `Hash`, `Eq`, `Serialize`, `Deserialize`
- ✅ Обновлены 15+ модулей:
- `tdlib/types.rs`, `tdlib/chats.rs`, `tdlib/messages.rs`, `tdlib/users.rs`
- `tdlib/reactions.rs`, `tdlib/client.rs`
- `app/mod.rs`, `app/chat_state.rs`, `input/main_input.rs`
- Test helpers: `app_builder.rs`, `test_data.rs`
- ✅ Исправлены 53 ошибки компиляции
- ✅ Код компилируется успешно
**Преимущества**:
- Невозможно случайно передать message_id вместо chat_id
- Компилятор поймает ошибки
- Улучшенная читаемость
- Невозможно случайно передать message_id вместо chat_id
- Компилятор ловит ошибки на этапе компиляции
- Улучшенная читаемость кода
- ✅ Самодокументирующиеся типы
---
@@ -608,12 +626,17 @@ tracing-subscriber = "0.3"
- [x] P1.1 — ChatState enum
- [x] P1.2 — Разделить TdClient
- [x] P1.3 — Константы
- [x] Priority 2: 2/5 задач (40%)
- [x] Priority 2: 3/5 задач (60%)
- [x] P2.5 — Error enum
- [x] P2.3 — Config validation
- [x] P2.4 — Newtype для ID
- [ ] P2.6 — MessageInfo реструктуризация
- [ ] P2.7 — MessageBuilder pattern
- [ ] Priority 3: 0/4 задач
- [ ] Priority 4: 0/4 задач
- [ ] Priority 5: 0/3 задач
**Всего**: 5/17 задач (29%)
**Всего**: 6/17 задач (35%)
---