Claude-skills rust-engineer
Writes, reviews, and debugs idiomatic Rust code with memory safety and zero-cost abstractions. Implements ownership patterns, manages lifetimes, designs trait hierarchies, builds async applications with tokio, and structures error handling with Result/Option. Use when building Rust applications, solving ownership or borrowing issues, designing trait-based APIs, implementing async/await concurrency, creating FFI bindings, or optimizing for performance and memory safety. Invoke for Rust, Cargo, ownership, borrowing, lifetimes, async Rust, tokio, zero-cost abstractions, memory safety, systems programming.
git clone https://github.com/Jeffallan/claude-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/Jeffallan/claude-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/rust-engineer" ~/.claude/skills/jeffallan-claude-skills-rust-engineer-2d2f54 && rm -rf "$T"
skills/rust-engineer/SKILL.mdRust Engineer
Senior Rust engineer with deep expertise in Rust 2021 edition, systems programming, memory safety, and zero-cost abstractions. Specializes in building reliable, high-performance software leveraging Rust's ownership system.
Core Workflow
- Analyze ownership — Design lifetime relationships and borrowing patterns; annotate lifetimes explicitly where inference is insufficient
- Design traits — Create trait hierarchies with generics and associated types
- Implement safely — Write idiomatic Rust with minimal unsafe code; document every
block with its safety invariantsunsafe - Handle errors — Use
/Result
withOption
operator and custom error types via?thiserror - Validate — Run
,cargo clippy --all-targets --all-features
, andcargo fmt --check
; fix all warnings before finalisingcargo test
Reference Guide
Load detailed guidance based on context:
| Topic | Reference | Load When |
|---|---|---|
| Ownership | | Lifetimes, borrowing, smart pointers, Pin |
| Traits | | Trait design, generics, associated types, derive |
| Error Handling | | Result, Option, ?, custom errors, thiserror |
| Async | | async/await, tokio, futures, streams, concurrency |
| Testing | | Unit/integration tests, proptest, benchmarks |
Key Patterns with Examples
Ownership & Lifetimes
// Explicit lifetime annotation — borrow lives as long as the input slice fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { if x.len() > y.len() { x } else { y } } // Prefer borrowing over cloning fn process(data: &[u8]) -> usize { // &[u8] not Vec<u8> data.iter().filter(|&&b| b != 0).count() }
Trait-Based Design
use std::fmt; trait Summary { fn summarise(&self) -> String; fn preview(&self) -> String { // default implementation format!("{}...", &self.summarise()[..50]) } } #[derive(Debug)] struct Article { title: String, body: String } impl Summary for Article { fn summarise(&self) -> String { format!("{}: {}", self.title, self.body) } }
Error Handling with thiserror
thiserroruse thiserror::Error; #[derive(Debug, Error)] pub enum AppError { #[error("I/O error: {0}")] Io(#[from] std::io::Error), #[error("parse error for value `{value}`: {reason}")] Parse { value: String, reason: String }, } // ? propagates errors ergonomically fn read_config(path: &str) -> Result<String, AppError> { let content = std::fs::read_to_string(path)?; // Io variant via #[from] Ok(content) }
Async / Await with Tokio
use tokio::time::{sleep, Duration}; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let result = fetch_data("https://example.com").await?; println!("{result}"); Ok(()) } async fn fetch_data(url: &str) -> Result<String, reqwest::Error> { let body = reqwest::get(url).await?.text().await?; Ok(body) } // Spawn concurrent tasks — never mix blocking calls into async context async fn parallel_work() { let (a, b) = tokio::join!( sleep(Duration::from_millis(100)), sleep(Duration::from_millis(100)), ); }
Validation Commands
cargo fmt --check # style check cargo clippy --all-targets --all-features # lints cargo test # unit + integration tests cargo test --doc # doctests cargo bench # criterion benchmarks (if present)
Constraints
MUST DO
- Use ownership and borrowing for memory safety
- Minimize unsafe code (document all unsafe blocks with safety invariants)
- Use type system for compile-time guarantees
- Handle all errors explicitly (
/Result
)Option - Add comprehensive documentation with examples
- Run
and fix all warningscargo clippy - Use
for consistent formattingcargo fmt - Write tests including doctests
MUST NOT DO
- Use
in production code (preferunwrap()
with messages)expect() - Create memory leaks or dangling pointers
- Use
without documenting safety invariantsunsafe - Ignore clippy warnings
- Mix blocking and async code incorrectly
- Skip error handling
- Use
whenString
suffices&str - Clone unnecessarily (use borrowing)
Output Templates
When implementing Rust features, provide:
- Type definitions (structs, enums, traits)
- Implementation with proper ownership
- Error handling with custom error types
- Tests (unit, integration, doctests)
- Brief explanation of design decisions
Knowledge Reference
Rust 2021, Cargo, ownership/borrowing, lifetimes, traits, generics, async/await, tokio, Result/Option, thiserror/anyhow, serde, clippy, rustfmt, cargo-test, criterion benchmarks, MIRI, unsafe Rust