Loading...
Loading...
Idiomatic Rust patterns for ownership, errors, traits, and configuration. Use when: - Writing or reviewing Rust code - Designing error handling with Result and thiserror - Implementing traits and composition patterns - Working with ownership and borrowing - Configuring Cargo features Keywords: Rust, ownership, borrowing, Result, thiserror, anyhow, trait, lifetimes, Cargo features, unsafe
npx skill4agent add phrazzld/claude-config rust-patternsResult<T, E>// Use thiserror for library error types
#[derive(Debug, thiserror::Error)]
pub enum UserError {
#[error("user not found: {0}")]
NotFound(String),
#[error("invalid email format")]
InvalidEmail,
#[error("database error: {0}")]
Database(#[from] sqlx::Error),
}
// Use anyhow for applications (context chaining)
fn fetch_user(id: &str) -> anyhow::Result<User> {
let user = db.get(id)
.context("fetching user from database")?;
Ok(user)
}?// Good: Borrow for read-only
fn process(items: &[Item]) -> usize { ... }
// Good: Take ownership when storing/transforming
fn consume(items: Vec<Item>) -> Output { ... }
// Avoid: Excessive cloning
fn bad(items: &Vec<Item>) {
let copy = items.clone(); // Usually unnecessary
}trait Readable {
type Item;
fn read(&self) -> Self::Item;
}
trait Writable {
type Item;
fn write(&mut self, item: Self::Item);
}
// Compose through bounds
fn copy<R, W>(src: &R, dst: &mut W)
where
R: Readable<Item = Vec<u8>>,
W: Writable<Item = Vec<u8>>,
{ ... }[features]
default = ["json"]
json = ["serde_json"]
database = ["sqlx"]
full = ["json", "database"]#[cfg(feature = "json")]
pub mod json_support { ... }// SAFETY:// SAFETY: We verified ptr is non-null and properly aligned
// in the caller's bounds check above
unsafe { *ptr }unwrap()expect()Result<T, String>Rc<RefCell<T>>