--- Rule Name: 02-rust-specific Description: Rust-specific Cursor Rules --- Цель: гарантировать типобезопасный, асинхронно-корректный и наблюдаемый код, который сразу проходит тесты и деплой (см. 03-automated-pipeline). ### 🏷️ Типизация - Везде явные типы для публичных API и где это улучшает читаемость. - Используем `Option`, `Result`, `Vec`, `HashMap`. Избегать `dyn Any` — предпочесть `Box` или generics. - Константы — `UPPER_SNAKE_CASE` с `const` или `static` при необходимости. ### 🌀 AsyncIO (tokio) - Тесты в strict-режиме: никакого `std::thread::sleep` в async функциях. - `tokio::spawn` — только с явной жизненной стратегией (хранить JoinHandle, отменять, ждать). На shutdown — корректная отмена с таймаутом. - Любое I/O — с таймаутами (`tokio::time::timeout` или timeouts в клиентах). ### 🌐 HTTP (reqwest) - `reqwest::Client::new()` и проверка статуса; JSON — `resp.json::().await`. - Логируем URL/провайдера/модель, но не ключи. ### 🧾 Ошибки - EAFP. Узкие `match` и `?` оператор. В логах `error!` на неожиданных исключениях. - Фолбэки — только если безопасны и явно задокументированы в логике. ### 🔎 Логирование - Только `tracing` или `log` (никаких `println!`). Короткие, осмысленные сообщения, текущая эмодзи-семантика. ### 📁 Файлы/ресурсы - `std::path::PathBuf` для новых путей; `std::fs::create_dir_all`. - Явные кодировки (`encoding_rs`). Очистка temp через `Drop` trait или `finally` блоки. ### 🧪 Тесты - Новая логика — новые тесты. Параметризация `rstest` по возможности. - Конфигурация: `#[cfg(test)]` модули + `mockall` для моков. ### 🧱 Моделирование данных - Новые стабильные формы — `struct` с derive макросами вместо «сырых» HashMap. - Сериализацию/десериализацию выносить на границы через `serde`, а не в доменную логику. ### ⚙️ Производительность и фоновые задачи - Батчи и кеши. Избегать N× сетевых вызовов в петлях. - Фоновые циклы — с бэк-офф и джиттером. Счётчики прогресса и периодический дамп. ### 🧹 Стиль - SRP, ранние возвраты, мелкие функции. Rust формат + `rustfmt` импорты. ### 🔒 Безопасность - Никогда не логировать секреты. Тримминг внешнего контента в логах. - Используем `secrecy` для чувствительных данных. ### 🪓 Упрощения по умолчанию - Отдаём приоритет простым решениям (фиксируем 🪓), но без компромисса по типам/тестам/async. ### 🧿 Эмодзи - 🏷️ typing • 🌀 asyncio • 🌐 http • 🔎 logs • 🧾 errors • 🧪 tests • 📁 fs • ⚙️ perf • 🔒 sec • 🧵 thread • 🪓 simplify • 🩵 resilience