一键导入
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 职业分类
Expert code review for embedded/firmware projects with dual-model cross-review (Claude + Codex via ACP). Detects memory safety, interrupt hazards, RTOS pitfalls, hardware interface bugs, and C/C++ anti-patterns.
Explore and explain biology with depth adapted to any learner or expert.
Build with Bun runtime avoiding Node.js compatibility traps, bundler pitfalls, and package manager gotchas.
Guide CS learning from first programs to research and industry practice.
"Database Design Helper - 数据库设计助手. Use when you need database design capabilities. Triggers on: database design."
Reference tool for life — covers intro, guide, tips and more. Quick lookup for Dream Interpreter concepts, best practices, and implementation patterns.
| name | rust-patterns |
| description | Production Rust patterns covering ownership, async Tokio, Axum web framework, SQLx, error handling, CLI tools, WASM, and PyO3 Python bindings |
| version | 1.0.0 |
| tags | ["rust","systems-programming","tokio","axum","midos"] |
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<f64>) -> f64 {
data.iter().sum()
}
// Build with: maturin develop --release
// Use from Python: import mymodule; result = mymodule.fast_compute([1.0, 2.0])
// 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