rust-patterns
Production Rust patterns covering ownership, async Tokio, Axum web framework, SQLx, error handling, CLI tools, WASM, and PyO3 Python bindings
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Production Rust patterns covering ownership, async Tokio, Axum web framework, SQLx, error handling, CLI tools, WASM, and PyO3 Python bindings
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Push the LLM to reconsider, refine, and improve its recent output. Use when user asks for deeper critique or mentions a known deeper critique method, e.g. socratic, first principles, pre-mortem, red team.
System architect and technical design leader. Use when the user asks to talk to Winston or requests the architect.
Senior software engineer for story execution and code implementation. Use when the user asks to talk to Amelia or requests the developer agent.
Facilitate interactive brainstorming sessions using diverse creative techniques and ideation methods. Use when the user says help me brainstorm or help me ideate.
Review code changes adversarially using parallel review layers (Blind Hunter, Edge Case Hunter, Acceptance Auditor) with structured triage into actionable categories. Use when the user says "run code review" or "review this code"
Break requirements into epics and user stories. Use when the user says "create the epics and stories list"
| name | rust-patterns |
| description | Production Rust patterns covering ownership, async Tokio, Axum web framework, SQLx, error handling, CLI tools, WASM, and PyO3 Python bindings |
A comprehensive guide to production Rust patterns for 2026. Covers ownership and borrowing mental models, error handling with thiserror/anyhow, async concurrency with Tokio, web services with Axum, database access (SQLx, Diesel, SeaORM), CLI development, WebAssembly, and Python bindings via PyO3. Targets Rust Edition 2024 (1.85.0+).
Install this skill to get production-ready Rust patterns including:
When working on Rust projects, this skill provides context for:
Think of ownership like a title deed:
let y = x): You transfer the deed. x is no longer valid.&T): Multiple readers simultaneously, no modifications.&mut T): One exclusive borrower who can modify. No others inside.// Quick pattern reference
fn risky() -> Result<T, E> {
let x = operation()?; // ? operator: early return on error
Ok(x)
}
// Shared mutable state across threads
let data = Arc::new(Mutex::new(vec![]));
let clone = Arc::clone(&data);
tokio::spawn(async move { clone.lock().unwrap().push(1); });
Use thiserror for libraries (callers need matchable error variants):
use thiserror::Error;
#[derive(Error, Debug)]
pub enum MyError {
#[error("file not found: {0}")]
FileNotFound(String),
#[error("io error: {0}")]
IoError(#[from] io::Error), // auto-converts from io::Error
}
Use anyhow for applications (add context to error chains):
use anyhow::{Result, Context};
fn main() -> Result<()> {
let data = std::fs::read_to_string("user.json")
.context("could not read user.json")?;
Ok(())
}
// Multi-threaded runtime
#[tokio::main(flavor = "multi_thread", worker_threads = 4)]
async fn main() { ... }
// Race futures: select! picks the first to complete
let winner = tokio::select! {
result = slow_future() => result,
result = fast_future() => result,
_ = tokio::time::sleep(Duration::from_secs(5)) => "timeout",
};
// Blocking code inside async: use spawn_blocking
let data = tokio::task::spawn_blocking(|| {
std::fs::read_to_string("file.txt")
}).await.unwrap();
Anti-pattern: blocking sync I/O inside async fn. Use tokio::fs instead of std::fs.
use axum::{Router, routing::{get, post}, Json, http::StatusCode};
use std::sync::Arc;
#[derive(Clone)]
struct AppState { db_url: String }
async fn create_user(Json(user): Json<User>) -> (StatusCode, Json<User>) {
(StatusCode::CREATED, Json(user))
}
#[tokio::main]
async fn main() {
let state = Arc::new(AppState { db_url: "postgres://...".into() });
let app = Router::new()
.route("/users", post(create_user))
.with_state(state);
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
// Arc<Mutex<T>>: shared mutable state across threads
let counter = Arc::new(Mutex::new(0));
for _ in 0..10 {
let c = Arc::clone(&counter);
thread::spawn(move || { *c.lock().unwrap() += 1; });
}
// RwLock: multiple readers OR one writer
let data = Arc::new(RwLock::new(vec!["a", "b"]));
let read = data.read().unwrap(); // shared read
let write = data.write().unwrap(); // exclusive write
// Rayon: parallel iterators (automatic work-stealing)
use rayon::prelude::*;
let sum: u64 = (1..=1_000_000).collect::<Vec<_>>().par_iter().sum();
Prefer channels over Arc for message-passing patterns.
use sqlx::PgPool;
let pool = PgPool::connect("postgres://user:pass@localhost/db").await?;
let users: Vec<(i32, String)> = sqlx::query_as(
"SELECT id, name FROM users WHERE age > $1"
).bind(18).fetch_all(&pool).await?;
Database selection: sqlx for raw SQL with compile-time checks, diesel for type-safe query builder (sync), sea-orm for full async ORM.
use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(name = "myapp", about = "My CLI tool")]
struct Cli {
#[arg(short, long)] verbose: bool,
#[command(subcommand)] command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Process { #[arg(short, long)] format: String },
Download { url: String },
}
use pyo3::prelude::*;
#[pymodule]
fn mymodule(py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(fast_compute, m)?)?;
Ok(())
}
#[pyfunction]
fn fast_compute(data: Vec<i64>) -> i64 {
data.iter().sum()
}
// Build with: maturin develop --release
// Use from Python: import mymodule; result = mymodule.fast_compute([1, 2])
// Async traits work natively (no async_trait crate needed)
pub trait Fetcher {
async fn fetch(&self, url: &str) -> Result<String>;
}
// Let chains: cleaner nested conditions
if let Some(x) = get_value()
&& x > 0
&& let y = x * 2
&& y < 100
{
println!("All conditions met: {}", y);
}
| Anti-Pattern | Better Approach |
|---|---|
| Over-cloning to bypass borrow checker | Use references &T instead |
| Arc<Mutex> everywhere | Single owner + mutable ref, or channels |
| .unwrap() in library code | Return Result<T, E> |
| Sync I/O in async functions | Use tokio::fs, spawn_blocking |
cargo add tokio --features full - async runtimecargo add axum serde serde_json - web + serializationcargo add thiserror anyhow - error handlingPublished by MidOS — MCP Community Library