PluginBench
Skill
Pass
Audit score 90

rust-engineer

jeffallan/claude-skills

Senior Rust engineer for memory-safe, high-performance code with ownership, async, and trait design.

What is rust-engineer?

Writes, reviews, and debugs idiomatic Rust code leveraging ownership, lifetimes, and zero-cost abstractions. Use when building systems applications, solving borrowing issues, designing trait hierarchies, implementing async/await with tokio, or optimizing for memory safety and performance.

  • Analyzes ownership patterns and manages explicit lifetime annotations
  • Designs trait hierarchies with generics and associated types
  • Implements error handling with Result/Option and custom error types via thiserror
  • Builds async applications with tokio, futures, and concurrent task spawning
  • Validates code with cargo clippy, cargo fmt, and comprehensive testing
  • Minimizes unsafe code with documented safety invariants

How to install rust-engineer

npx skills add https://github.com/jeffallan/claude-skills --skill rust-engineer
Claude Code
Cursor
Windsurf
Cline

How to use rust-engineer

  1. 1.Describe your Rust problem or code context (ownership, traits, async, error handling, etc.)
  2. 2.Provide existing code or describe the design challenge
  3. 3.Request specific guidance: code review, implementation, debugging, or pattern explanation
  4. 4.Run suggested validation commands: cargo fmt, cargo clippy, cargo test
  5. 5.Iterate on design with feedback from the skill

Use cases

Good for
  • Building systems-level applications requiring memory safety guarantees
  • Refactoring code to fix ownership and borrowing conflicts
  • Designing trait-based APIs for extensible architectures
  • Implementing concurrent services with tokio async/await
  • Creating FFI bindings and performance-critical code
Who it's for
  • Systems programmers and backend engineers
  • Rust library and framework developers
  • Teams building high-performance, memory-safe applications
  • Developers migrating from C/C++ to Rust
  • Anyone solving ownership, lifetime, or async concurrency issues

rust-engineer FAQ

When should I use explicit lifetime annotations?

Use explicit lifetimes when the compiler cannot infer them, particularly in function signatures with multiple references or when returning borrowed data. Lifetimes document the relationship between input and output borrows.

How do I choose between Result and Option?

Use Option for values that may or may not exist (Some/None). Use Result for operations that can fail with an error; pair with the ? operator for ergonomic error propagation.

Can I mix blocking and async code?

No. Blocking calls in async contexts will stall the runtime. Use tokio::task::spawn_blocking for blocking operations, or use async-compatible libraries like reqwest instead of std::fs in async contexts.

What is the difference between String and &str?

String is an owned, heap-allocated buffer; &str is a borrowed string slice. Prefer &str in function parameters to accept both String and string literals without cloning.

When is unsafe code necessary?

Unsafe is needed for FFI, low-level memory manipulation, and performance-critical code. Always document the safety invariants and use MIRI to verify correctness.

Full instructions (SKILL.md)

Source of truth, from jeffallan/claude-skills.


name: rust-engineer description: 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. license: MIT metadata: author: https://github.com/Jeffallan version: "1.1.0" domain: language triggers: Rust, Cargo, ownership, borrowing, lifetimes, async Rust, tokio, zero-cost abstractions, memory safety, systems programming role: specialist scope: implementation output-format: code related-skills: test-master

Rust 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

  1. Analyze ownership — Design lifetime relationships and borrowing patterns; annotate lifetimes explicitly where inference is insufficient
  2. Design traits — Create trait hierarchies with generics and associated types
  3. Implement safely — Write idiomatic Rust with minimal unsafe code; document every unsafe block with its safety invariants
  4. Handle errors — Use Result/Option with ? operator and custom error types via thiserror
  5. Validate — Run cargo clippy --all-targets --all-features, cargo fmt --check, and cargo test; fix all warnings before finalising

Reference Guide

Load detailed guidance based on context:

TopicReferenceLoad When
Ownershipreferences/ownership.mdLifetimes, borrowing, smart pointers, Pin
Traitsreferences/traits.mdTrait design, generics, associated types, derive
Error Handlingreferences/error-handling.mdResult, Option, ?, custom errors, thiserror
Asyncreferences/async.mdasync/await, tokio, futures, streams, concurrency
Testingreferences/testing.mdUnit/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

use 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 cargo clippy and fix all warnings
  • Use cargo fmt for consistent formatting
  • Write tests including doctests

MUST NOT DO

  • Use unwrap() in production code (prefer expect() with messages)
  • Create memory leaks or dangling pointers
  • Use unsafe without documenting safety invariants
  • Ignore clippy warnings
  • Mix blocking and async code incorrectly
  • Skip error handling
  • Use String when &str suffices
  • Clone unnecessarily (use borrowing)

Output Templates

When implementing Rust features, provide:

  1. Type definitions (structs, enums, traits)
  2. Implementation with proper ownership
  3. Error handling with custom error types
  4. Tests (unit, integration, doctests)
  5. 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

Documentation