Rust
Skill nimadorostkar/Claude-Skills-collection/skills/languages/rust
Use when writing Rust or resolving borrow-checker, lifetime, and trait errors. Covers ownership models, error handling with thiserror and anyhow, async with Tokio, and safe abstractions over unsafe code.From its SKILL.md
npx -y skills add nimadorostkar/Claude-Skills-collection --skill rustAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
SKILL.md
4.0 KB, 893 tokens by cl100k_base, as published. Nobody here has run it
Rust
Purpose
Write Rust that satisfies the borrow checker by design rather than by fighting it. Ownership is a modeling decision made before the code is written, not a compiler obstacle discovered afterward.
When to Use
- Building Rust libraries, services, or CLI tools.
- Resolving lifetime, borrow, or trait-bound errors.
- Designing error types for a library versus an application.
- Writing async Rust with Tokio.
- Auditing or minimizing
unsafeblocks.
Capabilities
- Ownership and borrowing design: when to clone, when to borrow, when to use
Rc/Arc. - Error modeling:
thiserrorfor libraries,anyhowfor binaries. - Trait design, generic bounds, and trait objects.
- Async runtimes,
Send/Syncbounds, and cancellation semantics. - Safe encapsulation of
unsafe, with documented invariants.
Inputs
- Crate or module source.
- Edition and MSRV.
- Whether the artifact is a library (stable public API) or a binary.
Outputs
- Code that compiles with zero warnings under
clippy::pedantic(or a documented allow-list). - Explicit error enums with
#[from]conversions. - Tests including compile-fail tests for API misuse where warranted.
Workflow
- Model ownership first — Decide who owns each value and how long it lives before writing the signature.
- Design the error type — A library's error enum is public API. Enumerate failure modes explicitly.
- Implement — Start with owned values and clones. Optimize to borrows only where profiling or ergonomics justify it.
- Constrain generics late — Write it concrete, then generalize if a second caller appears.
- Gate —
cargo clippy -- -D warnings,cargo fmt --check,cargo test,cargo deny check.
Best Practices
- A
clone()in non-hot-path code is not a defect. Premature borrow optimization produces unreadable lifetimes. - Libraries return concrete error enums; binaries use
anyhow::Resultand add context at each layer. - Never
unwrap()outside tests andmain. Useexpect("invariant: ...")where the invariant is genuinely proven. - Prefer
impl Traitin argument position for simple bounds; use named generics when the caller must choose the type. - Every
unsafeblock gets a// SAFETY:comment stating the invariant that makes it sound. - Use
#[non_exhaustive]on public enums you may extend.
Examples
Library error type:
use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum StoreError {
#[error("key not found: {0}")]
NotFound(String),
#[error("storage backend unavailable")]
Unavailable(#[source] std::io::Error),
#[error("value for {key} exceeds {limit} bytes")]
TooLarge { key: String, limit: usize },
}
pub fn get(key: &str) -> Result<Vec<u8>, StoreError> {
std::fs::read(key).map_err(|e| match e.kind() {
std::io::ErrorKind::NotFound => StoreError::NotFound(key.to_owned()),
_ => StoreError::Unavailable(e),
})
}
Async with timeout and cancellation:
use tokio::time::{timeout, Duration};
pub async fn fetch_with_deadline(url: &str) -> anyhow::Result<String> {
let body = timeout(Duration::from_secs(5), reqwest::get(url))
.await
.context("request timed out after 5s")?
.context("request failed")?
.text()
.await?;
Ok(body)
}
Notes
- Borrow-checker errors are usually design feedback. If a lifetime is hard to name, the ownership model is probably wrong.
Arc<Mutex<T>>is a legitimate answer, not a failure. Contention, not the type, is what costs you.- Async traits are stable as of Rust 1.75 for non-object-safe use;
async-traitis still needed for trait objects.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.