SKILL.md
$2a
Borrowing & Ownership
- Prefer
&Tover.clone()unless ownership transfer is required
- Use
&stroverString,&[T]overVec<T>in function parameters
- Small
Copytypes (≤24 bytes) can be passed by value
- Use
Cow<'_, T>when ownership is ambiguous
Error Handling
- Return
Result<T, E>for fallible operations; avoidpanic!in production
- Never use
unwrap()/expect()outside tests
- Use
thiserrorfor library errors,anyhowfor binaries only
- Prefer
?operator over match chains for error propagation
Performance
- Always benchmark with
--releaseflag
- Run
cargo clippy -- -D clippy::perffor performance hints
- Avoid cloning in loops; use
.iter()instead of.into_iter()for Copy types
- Prefer iterators over manual loops; avoid intermediate
.collect()calls
Linting
Run regularly: cargo clippy --all-targets --all-features --locked -- -D warnings
Key lints to watch:
redundant_clone- unnecessary cloning
large_enum_variant- oversized variants (consider boxing)
needless_collect- premature collection
Use #[expect(clippy::lint)] over #[allow(...)] with justification comment.
Testing
- Name tests descriptively:
process_should_return_error_when_input_empty()
- One assertion per test when possible
- Use doc tests (
///) for public API examples
- Consider
cargo instafor snapshot testing generated output
Generics & Dispatch
- Prefer generics (static dispatch) for performance-critical code
- Use
dyn Traitonly when heterogeneous collections are needed
- Box at API boundaries, not internally
Type State Pattern
Encode valid states in the type system to catch invalid operations at compile time:
struct Connection<State> { /* ... */ _state: PhantomData<State> }
struct Disconnected;
struct Connected;
impl Connection<Connected> {
fn send(&self, data: &[u8]) { /* only connected can send */ }
}
Documentation
//comments explain why (safety, workarounds, design rationale)
///doc comments explain what and how for public APIs
- Every
TODOneeds a linked issue:// TODO(#42): ...
- Enable
#![deny(missing_docs)]for libraries