Files
quoter/.cursor/rules/02-rust-specific.mdc
Untone a44bf3302b
Some checks failed
Deploy / deploy (push) Has been skipped
CI / test (push) Successful in 6m50s
CI / lint (push) Failing after 1m5s
test-fix
2025-08-12 15:59:51 +03:00

58 lines
3.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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