From qe-framework
Writes, reviews, and debugs idiomatic Rust code with memory safety and zero-cost abstractions. Handles ownership, lifetimes, trait hierarchies, async with tokio, and error handling with Result/Option.
How this skill is triggered — by the user, by Claude, or both
Slash command
/qe-framework:Qrust-engineerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
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.
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.
unsafe block with its safety invariantsResult/Option with ? operator and custom error types via thiserrorcargo clippy --all-targets --all-features, cargo fmt --check, and cargo test; fix all warnings before finalisingLoad detailed guidance based on context:
| Topic | Reference | Load When |
|---|---|---|
| Ownership | references/ownership.md | Lifetimes, borrowing, smart pointers, Pin |
| Traits | references/traits.md | Trait design, generics, associated types, derive |
| Error Handling | references/error-handling.md | Result, Option, ?, custom errors, thiserror |
| Async | references/async.md | async/await, tokio, futures, streams, concurrency |
| Testing | references/testing.md | Unit/integration tests, proptest, benchmarks |
// 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()
}
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)
}
}
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)
}
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)),
);
}
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)
/// A configuration holder for database connections.
///
/// # Examples
/// ```
/// let config = DbConfig::new("localhost", 5432);
/// assert_eq!(config.host, "localhost");
/// ```
pub struct DbConfig {
/// Database server hostname
pub host: String,
/// Port number for connection
pub port: u16,
}
impl DbConfig {
/// Creates a new database configuration.
pub fn new(host: &str, port: u16) -> Self {
Self { host: host.to_string(), port }
}
}
use thiserror::Error;
/// Custom error type for validation failures.
#[derive(Debug, Error)]
pub enum ValidationError {
#[error("invalid email: {0}")]
InvalidEmail(String),
#[error("io error: {0}")]
Io(#[from] std::io::Error),
}
/// Validates input and returns Result with custom error.
///
/// # Examples
/// ```
/// assert!(validate_email("[email protected]").is_ok());
/// assert!(validate_email("invalid").is_err());
/// ```
pub fn validate_email(email: &str) -> Result<(), ValidationError> {
if email.contains('@') { Ok(()) } else {
Err(ValidationError::InvalidEmail(email.to_string()))
}
}
use tokio::sync::Mutex;
use std::sync::Arc;
/// Async trait for data processing.
#[async_trait::async_trait]
pub trait DataProcessor {
/// Processes data asynchronously.
/// # Examples
/// ```ignore
/// let processor = MyProcessor::new();
/// processor.process(&data).await?;
/// ```
async fn process(&self, data: &[u8]) -> Result<String, Box<dyn std::error::Error>>;
}
pub struct ConcurrentProcessor {
cache: Arc<Mutex<Vec<String>>>,
}
#[async_trait::async_trait]
impl DataProcessor for ConcurrentProcessor {
async fn process(&self, data: &[u8]) -> Result<String, Box<dyn std::error::Error>> {
let result = tokio::task::spawn_blocking(|| {
String::from_utf8_lossy(data).to_string()
}).await?;
self.cache.lock().await.push(result.clone());
Ok(result)
}
}
Function: Use /// with # Examples code block
/// Computes factorial of n.
/// # Examples
/// ```
/// assert_eq!(factorial(5), 120);
/// ```
pub fn factorial(n: u32) -> u32 { ... }
Struct/Fields: Document each field
/// Represents a user account.
pub struct User {
/// User's unique identifier
pub id: u64,
/// User's email address
pub email: String,
}
Module: Use //! at file top
//! Module for user account management and authentication.
Primary Checks:
cargo clippy -- -D warnings — enforce all warnings as errorscargo clippy --fix — auto-fix common issuesrustfmt {file} or cargo fmt — apply formattingcargo check — fast type checking without buildingConfig Files:
clippy.toml — configure clippy behaviorrustfmt.toml — set formatting rules (edition, max_width, etc.)// SAFETY: comments explaining why invariants holdchecked_add(), saturating_add(), or wrapping variants; never assume arithmetic is safeget(), iterators) instead of raw indexingunwrap()/panic!(); return Result to let caller decide error handling| Wrong | Correct |
|---|---|
let x = value.unwrap(); | let x = value?; or value.expect("reason") |
let copy = data.clone(); | let ref = &data; or pass reference |
fn process(s: String) | fn process(s: &str) for owned data |
| Ignore clippy lint warnings | Run and fix: cargo clippy --fix |
let mut lock = m.lock().unwrap(); async { ... } | Use tokio::sync::Mutex in async code |
Result/Option)cargo clippy and fix all warningscargo fmt for consistent formattingunwrap() in production code (prefer expect() with messages)unsafe without documenting safety invariantsString when &str sufficesWhen implementing Rust features, provide:
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
npx claudepluginhub inho-team/qe-framework --plugin qe-frameworkCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.