58 lines
3.7 KiB
Plaintext
58 lines
3.7 KiB
Plaintext
---
|
||
Rule Name: 02-rust-specific
|
||
Description: Rust-specific Cursor Rules
|
||
---
|
||
|
||
Цель: гарантировать типобезопасный, асинхронно-корректный и наблюдаемый код, который сразу проходит тесты и деплой (см. 03-automated-pipeline).
|
||
|
||
### 🏷️ Типизация
|
||
- Везде явные типы для публичных API и где это улучшает читаемость.
|
||
- Используем `Option<T>`, `Result<T, E>`, `Vec<T>`, `HashMap<K, V>`. Избегать `dyn Any` — предпочесть `Box<dyn Trait>` или 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::<T>().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
|
||
|