refactor: add MessageBuilder with fluent API (P2.7)

Добавлен MessageBuilder для удобного создания MessageInfo с помощью
fluent API вместо вызова конструктора с 14 параметрами.

Изменения:
- Создан MessageBuilder в tdlib/types.rs с fluent API
- Реализованы методы:
  * new(id) - создание builder с обязательным ID
  * sender_name(), text(), entities(), date(), edit_date()
  * outgoing(), incoming(), read(), unread(), edited()
  * editable(), deletable_for_self(), deletable_for_all()
  * reply_to(), forward_from(), reactions(), add_reaction()
  * build() - финальное создание MessageInfo
- Обновлён convert_message() для использования builder
- Добавлен экспорт MessageBuilder в tdlib/mod.rs
- Добавлены 6 unit тестов демонстрирующих fluent API

Преимущества:
- Более читабельный код создания сообщений
- Самодокументирующийся API
- Гибкость в установке опциональных полей
- Легче добавлять новые поля в будущем

Пример использования:
```rust
let message = MessageBuilder::new(MessageId::new(123))
    .sender_name("Alice")
    .text("Hello, world!")
    .outgoing()
    .read()
    .build();
```

Статус: Priority 2 ЗАВЕРШЁН 100% (5/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 02:02:07 +03:00
parent 5709fab9c3
commit c42976c358
3 changed files with 323 additions and 18 deletions

View File

@@ -870,22 +870,43 @@ impl TdClient {
// Извлекаем реакции
let reactions = self.extract_reactions(message);
MessageInfo::new(
message_id,
sender_name,
message.is_outgoing,
content,
entities,
message.date,
message.edit_date,
is_read,
message.can_be_edited,
message.can_be_deleted_only_for_self,
message.can_be_deleted_for_all_users,
reply_to,
forward_from,
reactions,
)
// Используем MessageBuilder для более читабельного создания
let mut builder = crate::tdlib::MessageBuilder::new(message_id)
.sender_name(sender_name)
.text(content)
.entities(entities)
.date(message.date)
.edit_date(message.edit_date);
// Применяем флаги
if message.is_outgoing {
builder = builder.outgoing();
}
if is_read {
builder = builder.read();
}
if message.can_be_edited {
builder = builder.editable();
}
if message.can_be_deleted_only_for_self {
builder = builder.deletable_for_self();
}
if message.can_be_deleted_for_all_users {
builder = builder.deletable_for_all();
}
// Добавляем опциональные данные
if let Some(reply) = reply_to {
builder = builder.reply_to(reply);
}
if let Some(forward) = forward_from {
builder = builder.forward_from(forward);
}
if !reactions.is_empty() {
builder = builder.reactions(reactions);
}
builder.build()
}
/// Извлекает информацию о reply из сообщения