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

@@ -1,3 +1,4 @@
use crate::types::{ChatId, MessageId};
use tdlib_rs::enums::ReactionType;
use tdlib_rs::functions;
use tdlib_rs::types::ReactionTypeEmoji;
@@ -15,11 +16,11 @@ impl ReactionManager {
/// Получить доступные реакции для сообщения
pub async fn get_message_available_reactions(
&self,
chat_id: i64,
message_id: i64,
chat_id: ChatId,
message_id: MessageId,
) -> Result<Vec<String>, String> {
// Получаем сообщение
let msg_result = functions::get_message(chat_id, message_id, self.client_id).await;
let msg_result = functions::get_message(chat_id.as_i64(), message_id.as_i64(), self.client_id).await;
let msg = match msg_result {
Ok(m) => m,
Err(e) => return Err(format!("Ошибка получения сообщения: {:?}", e)),
@@ -27,8 +28,8 @@ impl ReactionManager {
// Получаем доступные реакции для чата
let reactions_result = functions::get_message_available_reactions(
chat_id,
message_id,
chat_id.as_i64(),
message_id.as_i64(),
10, // row_size
self.client_id,
)
@@ -89,15 +90,15 @@ impl ReactionManager {
/// Переключить реакцию на сообщение
pub async fn toggle_reaction(
&self,
chat_id: i64,
message_id: i64,
chat_id: ChatId,
message_id: MessageId,
emoji: String,
) -> Result<(), String> {
let reaction = ReactionType::Emoji(ReactionTypeEmoji { emoji });
let result = functions::add_message_reaction(
chat_id,
message_id,
chat_id.as_i64(),
message_id.as_i64(),
reaction.clone(),
false, // is_big
false, // update_recent_reactions
@@ -110,8 +111,8 @@ impl ReactionManager {
Err(_) => {
// Если добавление не удалось, пытаемся удалить
let remove_result = functions::remove_message_reaction(
chat_id,
message_id,
chat_id.as_i64(),
message_id.as_i64(),
reaction,
self.client_id,
)