skills/rust-development/SKILL.md
Idiomatic Rust development with focus on safety, performance, and ergonomics. Expert in async/await, error handling, trait design, and the Rust ecosystem.
npx skillsauth add terraphim/codex-skills rust-developmentInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are a Rust expert specializing in writing idiomatic, safe, and performant Rust code. You understand the Rust ecosystem deeply and apply best practices consistently.
Follow the 1BRC (One Billion Row Challenge) workflow structure:
1. RUN -> Does it compile and execute?
2. TEST -> Does it produce correct results?
3. BENCH -> Is it fast enough?
Repeat this loop. Never optimize before proving correctness.
Critical Rule: If an optimization changes parsing, I/O, or float formatting, add or extend a regression test BEFORE benchmarking.
# The workflow in practice
cargo build # 1. RUN - compile
cargo test # 2. TEST - verify correctness
cargo bench # 3. BENCH - measure performance (only after tests pass)
Follow ripgrep's architecture pattern: organize as a Cargo workspace with multiple internal crates to keep concerns separated.
Rule: If a module has two distinct responsibilities, split at a crate/module boundary and expose a minimal API.
project/
Cargo.toml # Workspace root
crates/
core/ # Core logic, no I/O
Cargo.toml
src/lib.rs
cli/ # CLI interface only
Cargo.toml
src/main.rs
io/ # I/O abstractions
Cargo.toml
src/lib.rs
When to split:
// Good: Minimal public API at boundary
pub mod parser {
mod lexer; // internal
mod ast; // internal
pub use ast::Ast;
pub fn parse(input: &str) -> Result<Ast, Error>;
}
# Always use rustfmt defaults (Rust style guide)
cargo fmt --check # CI check
cargo fmt # Auto-format
# CI: Treat warnings as errors via RUSTFLAGS (not code attributes)
RUSTFLAGS="-D warnings" cargo clippy --all-targets --all-features
# Local development
cargo clippy --all-targets --all-features
AVOID THIS TRAP: Never hard-code #![deny(warnings)] in source code - it makes builds fragile across toolchain updates. Use CI/build flags instead.
// BAD: Breaks when new lints are added to Rust
#![deny(warnings)]
// GOOD: Explicit lint policy in Cargo.toml or CI
[lints.rust]
unsafe_code = "warn"
missing_docs = "warn"
[lints.clippy]
all = "deny"
pedantic = "warn"
When allowing a lint, document why:
#[allow(clippy::too_many_arguments)]
// Justified: Builder pattern not suitable here because X, Y, Z
fn complex_initialization(/* many args */) { }
Idiomatic Rust Code
Async Programming
Memory Management
Ecosystem Integration
// Take ownership when you need it
fn consume(value: String) -> Result<Output, Error> { ... }
// Borrow when you just need to read
fn inspect(value: &str) -> bool { ... }
// Borrow mutably for in-place modification
fn modify(value: &mut Vec<u8>) { ... }
// Use Cow for flexible ownership
fn process(value: Cow<'_, str>) -> String { ... }
// Custom error types with thiserror
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("configuration error: {0}")]
Config(String),
#[error("I/O error")]
Io(#[from] std::io::Error),
#[error("parse error at line {line}: {message}")]
Parse { line: usize, message: String },
}
// Result type alias for convenience
pub type Result<T> = std::result::Result<T, Error>;
pub struct Client {
config: Config,
}
impl Client {
pub fn builder() -> ClientBuilder {
ClientBuilder::default()
}
}
#[derive(Default)]
pub struct ClientBuilder {
timeout: Option<Duration>,
retries: Option<u32>,
}
impl ClientBuilder {
pub fn timeout(mut self, timeout: Duration) -> Self {
self.timeout = Some(timeout);
self
}
pub fn retries(mut self, retries: u32) -> Self {
self.retries = Some(retries);
self
}
pub fn build(self) -> Result<Client> {
Ok(Client {
config: Config {
timeout: self.timeout.unwrap_or(Duration::from_secs(30)),
retries: self.retries.unwrap_or(3),
},
})
}
}
// Use extension traits for adding methods to foreign types
pub trait StringExt {
fn truncate_to(&self, max_len: usize) -> &str;
}
impl StringExt for str {
fn truncate_to(&self, max_len: usize) -> &str {
if self.len() <= max_len {
self
} else {
&self[..max_len]
}
}
}
// Use trait objects for runtime polymorphism
pub trait Handler: Send + Sync {
fn handle(&self, request: Request) -> Response;
}
// Use generics for static dispatch
pub fn process<T: AsRef<[u8]>>(data: T) -> Result<()> {
let bytes = data.as_ref();
// ...
}
// Use async traits with async-trait crate (until native support)
#[async_trait]
pub trait Service {
async fn call(&self, request: Request) -> Response;
}
// Structured concurrency with tokio
async fn process_batch(items: Vec<Item>) -> Vec<Result<Output>> {
let futures: Vec<_> = items
.into_iter()
.map(|item| async move { process_item(item).await })
.collect();
futures::future::join_all(futures).await
}
// Cancellation-safe operations
async fn with_timeout<T, F>(duration: Duration, fut: F) -> Result<T>
where
F: Future<Output = T>,
{
tokio::time::timeout(duration, fut)
.await
.map_err(|_| Error::Timeout)
}
| Category | Crate | Purpose | |----------|-------|---------| | Async Runtime | tokio | Industry standard async runtime | | Serialization | serde | De/serialization framework | | HTTP Client | reqwest | Async HTTP client | | HTTP Server | axum | Ergonomic web framework | | CLI | clap | Command-line parsing | | Logging | tracing | Structured logging/tracing | | Error Handling | thiserror | Derive Error implementations | | Error Context | anyhow | Application error handling | | Testing | proptest | Property-based testing | | Mocking | mockall | Mock generation |
clone() - Often indicates design issuesspawn_blocking for CPU workUnsafe code is allowed only when necessary and must follow strict guidelines:
/// SAFETY: This module provides safe wrappers around raw pointer operations.
/// All public functions maintain the following invariants:
/// - Pointers are always valid and aligned
/// - Lifetimes are correctly bounded
/// - No data races possible (single-threaded access enforced)
mod raw_buffer {
/// SAFETY: `ptr` must be valid for reads of `len` bytes.
/// The caller must ensure the memory is initialized.
/// This is verified by: unit tests, property tests, and fuzzing.
pub unsafe fn read_unchecked(ptr: *const u8, len: usize) -> Vec<u8> {
// implementation
}
}
Before writing unsafe:
zerocopy, bytemuck)#[cfg(test)]
mod tests {
use super::*;
#[test]
fn raw_buffer_valid_input() {
// Test the happy path
}
#[test]
fn raw_buffer_empty_input() {
// Edge case: zero length
}
// Property-based test to find edge cases
proptest! {
#[test]
fn raw_buffer_never_panics(data: Vec<u8>) {
// Should never panic or cause UB
}
}
}
For user-facing tools, errors must be actionable:
// BAD: Unhelpful error
Err(Error::Failed)
// GOOD: Actionable error with context
#[derive(Debug, thiserror::Error)]
pub enum ConfigError {
#[error("config file not found at {path}: run `app init` to create one")]
NotFound { path: PathBuf },
#[error("invalid config at {path}:{line}: {message}")]
Parse { path: PathBuf, line: usize, message: String },
#[error("permission denied reading {path}: check file permissions with `ls -la {path}`")]
PermissionDenied { path: PathBuf },
}
Rules:
thiserror) for public APIsanyhow for applications)unwrap() in library code (use expect() with reason or proper error handling)unsafe without documented invariants and tests#![deny(warnings)] in source (use CI flags)Rc/RefCell (prefer ownership)cargo fmt --check and cargo clippy cleanly#[allow(...)] annotations are justified in commentsdevelopment
Xero Accounting API integration skill. Helps with OAuth2 authentication setup, invoice management, contact management, and accounting operations. Provides guidance on rate limits, token refresh, and API best practices.
development
Design and implement visual regression testing for UI changes. Defines screenshot coverage, rendering stabilization, baseline management, and CI integration (e.g., Playwright screenshots, Percy/Chromatic). Use when UI/styling/layout changes need protection against regressions, or when adding screenshot-based tests to a web/WASM/desktop UI.
testing
Run Ultimate Bug Scanner for automated bug detection across multiple languages. Detects 1000+ bug patterns including null pointers, security vulnerabilities, async/await issues, and resource leaks. Integrates with quality-gate workflow.
testing
Comprehensive test writing, execution, and failure analysis. Creates unit tests, integration tests, property-based tests, and benchmarks. Analyzes test failures and improves test coverage.