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:
@@ -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%)
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user