Rust General
General Rust rules for safe, idiomatic application and library development
Awesome CursorRulesv10 stars · 0 forks · 0 makes≈514 tokens
Rust General Rules
Project Structure
- Keep crates focused and name modules by domain responsibility.
- Put reusable library code in
src/lib.rsand binary entry points insrc/main.rsorsrc/bin/. - Keep public APIs small and documented.
- Use feature flags deliberately and document non-default features.
- Commit
Cargo.lockfor applications; follow the project convention for libraries.
Ownership and Types
- Prefer borrowing over cloning when ownership is not needed.
- Use owned values at API boundaries when the callee must store data.
- Model domain states with enums and structs instead of strings or booleans.
- Use
Option<T>for absence andResult<T, E>for fallible operations. - Avoid
unwrap()andexpect()outside tests, examples, and process-startup invariants.
Error Handling
- Use
thiserroror project-standard custom errors for libraries. - Use
anyhowor project-standard context-rich errors for applications. - Add context when crossing IO, network, database, or parsing boundaries.
- Do not discard errors with
_unless explicitly documented.
Concurrency and Async
- Use
SendandSyncboundaries intentionally. - Prefer message passing or owned task inputs for async work.
- Do not hold blocking locks across
.await. - Use
tokio::task::spawn_blockingor equivalent for blocking CPU or IO in async applications. - Propagate cancellation through futures rather than hiding it in detached tasks.
Testing and Quality
- Run
cargo fmtandcargo clippybefore delivery. - Add unit tests for pure logic and integration tests for public behavior.
- Use property tests for parsers, serializers, and state machines when useful.
- Use benchmarks only after identifying a real performance question.
Common Mistakes
- Do not fight the borrow checker by adding unnecessary
Arc<Mutex<_>>. - Do not expose internal module structure through public APIs by accident.
- Do not allocate in hot loops without measuring.
- Do not use unsafe code unless the invariant is documented and tested.