docs: complete rustdoc documentation for all public APIs (P4.12)
Added comprehensive rustdoc documentation for all TDLib modules, configuration, and utility functions. TDLib modules documented: - src/tdlib/auth.rs - AuthManager, AuthState (6 doctests) - src/tdlib/chats.rs - ChatManager (8 doctests) - src/tdlib/messages.rs - MessageManager (14 methods, 6 doctests) - src/tdlib/reactions.rs - ReactionManager (3 doctests) - src/tdlib/users.rs - UserCache, LruCache (2 doctests) Configuration and utilities: - src/config.rs - Config, ColorsConfig, GeneralConfig (4 doctests) - src/formatting.rs - format_text_with_entities (2 doctests) Documentation includes: - Detailed descriptions of all public structs and methods - Usage examples with code snippets - Parameter and return value documentation - Notes about async behavior and edge cases - Cross-references between related functions Total: 34 doctests (30 ignored for async, 4 compiled) All 464 unit tests passing ✅ Priority 4.12 (Rustdoc) - 100% complete Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -6,15 +6,35 @@ use tdlib_rs::functions;
|
||||
|
||||
use super::types::UserOnlineStatus;
|
||||
|
||||
/// Простой LRU-кэш на основе HashMap + Vec для отслеживания порядка
|
||||
/// LRU (Least Recently Used) кэш с фиксированной ёмкостью.
|
||||
///
|
||||
/// Автоматически удаляет самые давно использованные элементы при достижении лимита.
|
||||
/// Основан на HashMap для быстрого доступа и Vec для отслеживания порядка использования.
|
||||
///
|
||||
/// # Type Parameters
|
||||
///
|
||||
/// * `V` - Тип значения (должен реализовывать `Clone`)
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```ignore
|
||||
/// let mut cache = LruCache::<String>::new(100);
|
||||
/// cache.insert(UserId::new(1), "Alice".to_string());
|
||||
/// assert_eq!(cache.get(&UserId::new(1)), Some(&"Alice".to_string()));
|
||||
/// ```
|
||||
pub struct LruCache<V> {
|
||||
/// Хранилище ключ-значение.
|
||||
map: HashMap<UserId, V>,
|
||||
/// Порядок доступа: последний элемент — самый недавно использованный
|
||||
|
||||
/// Порядок доступа: последний элемент — самый недавно использованный.
|
||||
order: Vec<UserId>,
|
||||
|
||||
/// Максимальная ёмкость кэша.
|
||||
capacity: usize,
|
||||
}
|
||||
|
||||
impl<V: Clone> LruCache<V> {
|
||||
/// Создает новый LRU кэш с заданной ёмкостью.
|
||||
pub fn new(capacity: usize) -> Self {
|
||||
Self {
|
||||
map: HashMap::with_capacity(capacity),
|
||||
@@ -23,7 +43,7 @@ impl<V: Clone> LruCache<V> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Получить значение и обновить порядок доступа
|
||||
/// Получает значение и обновляет порядок доступа (помечает как использованное).
|
||||
pub fn get(&mut self, key: &UserId) -> Option<&V> {
|
||||
if self.map.contains_key(key) {
|
||||
// Перемещаем ключ в конец (самый недавно использованный)
|
||||
@@ -72,22 +92,56 @@ impl<V: Clone> LruCache<V> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Кеш пользователей и их данных
|
||||
/// Кэш информации о пользователях Telegram.
|
||||
///
|
||||
/// Хранит данные пользователей (имена, usernames, статусы) в LRU-кэшах
|
||||
/// для быстрого доступа без повторных запросов к TDLib.
|
||||
///
|
||||
/// # Возможности
|
||||
///
|
||||
/// - Кэширование имен пользователей (first_name + last_name)
|
||||
/// - Кэширование usernames (@username)
|
||||
/// - Кэширование онлайн-статусов
|
||||
/// - Связь chat_id → user_id для приватных чатов
|
||||
/// - Ленивая загрузка данных пользователей порциями
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```ignore
|
||||
/// let mut cache = UserCache::new(client_id);
|
||||
///
|
||||
/// // Обработать обновление пользователя
|
||||
/// cache.handle_user_update(&user_enum);
|
||||
///
|
||||
/// // Получить имя
|
||||
/// let name = cache.get_user_name(user_id).await;
|
||||
/// ```
|
||||
pub struct UserCache {
|
||||
/// LRU-кэш usernames: user_id -> username
|
||||
/// LRU-кэш usernames: user_id → username.
|
||||
pub user_usernames: LruCache<String>,
|
||||
/// LRU-кэш имён: user_id -> display_name (first_name + last_name)
|
||||
|
||||
/// LRU-кэш имён: user_id → display_name (first_name + last_name).
|
||||
pub user_names: LruCache<String>,
|
||||
/// Связь chat_id -> user_id для приватных чатов
|
||||
|
||||
/// Связь chat_id → user_id для приватных чатов.
|
||||
pub chat_user_ids: HashMap<ChatId, UserId>,
|
||||
/// Очередь user_id для загрузки имён
|
||||
|
||||
/// Очередь user_id для ленивой загрузки имён.
|
||||
pub pending_user_ids: Vec<UserId>,
|
||||
/// LRU-кэш онлайн-статусов пользователей: user_id -> status
|
||||
|
||||
/// LRU-кэш онлайн-статусов: user_id → status.
|
||||
pub user_statuses: LruCache<UserOnlineStatus>,
|
||||
|
||||
/// ID клиента TDLib для API вызовов.
|
||||
client_id: i32,
|
||||
}
|
||||
|
||||
impl UserCache {
|
||||
/// Создает новый кэш пользователей.
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `client_id` - ID клиента TDLib для API вызовов
|
||||
pub fn new(client_id: i32) -> Self {
|
||||
Self {
|
||||
user_usernames: LruCache::new(MAX_USER_CACHE_SIZE),
|
||||
@@ -120,7 +174,13 @@ impl UserCache {
|
||||
self.user_statuses.peek(user_id)
|
||||
}
|
||||
|
||||
/// Обработать обновление пользователя
|
||||
/// Обрабатывает обновление пользователя от TDLib.
|
||||
///
|
||||
/// Сохраняет username, имя и статус пользователя в соответствующие кэши.
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `user_enum` - Обновление пользователя от TDLib
|
||||
pub fn handle_user_update(&mut self, user_enum: &User) {
|
||||
if let User::User(user) = user_enum {
|
||||
let user_id = user.id;
|
||||
@@ -139,7 +199,12 @@ impl UserCache {
|
||||
}
|
||||
}
|
||||
|
||||
/// Обработать обновление статуса пользователя
|
||||
/// Обновляет онлайн-статус пользователя.
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `user_id` - ID пользователя
|
||||
/// * `status` - Новый статус от TDLib
|
||||
pub fn update_status(&mut self, user_id: UserId, status: &UserStatus) {
|
||||
let online_status = match status {
|
||||
UserStatus::Online(_) => UserOnlineStatus::Online,
|
||||
@@ -157,7 +222,17 @@ impl UserCache {
|
||||
self.chat_user_ids.insert(chat_id, user_id);
|
||||
}
|
||||
|
||||
/// Получить имя пользователя (асинхронно с загрузкой если нужно)
|
||||
/// Получает имя пользователя из кэша или загружает из TDLib.
|
||||
///
|
||||
/// Сначала проверяет кэш, затем при необходимости загружает из API.
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `user_id` - ID пользователя
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// Имя пользователя (first_name + last_name) или "User {id}" если не найден.
|
||||
pub async fn get_user_name(&self, user_id: UserId) -> String {
|
||||
// Сначала пытаемся получить из кэша
|
||||
if let Some(name) = self.user_names.peek(&user_id) {
|
||||
@@ -174,7 +249,14 @@ impl UserCache {
|
||||
}
|
||||
}
|
||||
|
||||
/// Обработать очередь отложенных user_ids (загрузка имён небольшими порциями)
|
||||
/// Обрабатывает очередь отложенных user_ids для ленивой загрузки.
|
||||
///
|
||||
/// Загружает данные пользователей небольшими порциями (по [`LAZY_LOAD_USERS_PER_TICK`])
|
||||
/// для избежания блокировки UI.
|
||||
///
|
||||
/// # Note
|
||||
///
|
||||
/// Вызывайте периодически в основном цикле приложения.
|
||||
pub async fn process_pending_user_ids(&mut self) {
|
||||
if self.pending_user_ids.is_empty() {
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user