rust-programming
Rust programming style guide and conventions. Use this skill when writing, reviewing, or modifying Rust code. Covers string creation, type annotations, control flow, naming conventions, imports, error handling, and Rust-specific best practices.
$ Installer
git clone https://github.com/attunehq/hurry /tmp/hurry && cp -r /tmp/hurry/.claude/skills/rust-programming ~/.claude/skills/hurry// tip: Run this command in your terminal to install the skill
name: rust-programming description: Rust programming style guide and conventions. Use this skill when writing, reviewing, or modifying Rust code. Covers string creation, type annotations, control flow, naming conventions, imports, error handling, and Rust-specific best practices.
Rust Programming Style Guide
Quick reference for project-specific Rust conventions. Load reference files for detailed examples.
Code Style Quick Reference
String Creation
- Use
String::from("...")instead of"...".to_string() - Use
String::new()instead of"".to_string()
Type Annotations
- Always use postfix types (turbofish syntax)
- ❌
let foo: Vec<_> = items.collect() - ✅
let foo = items.collect::<Vec<_>>()
Control Flow
Prefer let Some(value) = option else { ... } over .is_none() + .unwrap()
Array Indexing
Avoid array indexing. Use iterator methods: .enumerate(), .iter().map()
See references/indexing-patterns.md for detailed examples
Naming Conventions Quick Reference
Type Names: Avoid Stuttering
When a type is namespaced by its module, don't repeat context:
- ❌
storage::CasStorageorstorage::DiskStorage— stutters "storage" - ✅
storage::Disk— describes implementation (see courier/src/storage.rs:54) - ❌
db::PostgresDatabase— stutters "database" - ✅
db::Postgres— describes implementation (see courier/src/db.rs:29)
Enum Variants
Use single canonical variant with alias functions instead of separate variants for the same concept
See references/naming.md for complete guidelines
Function and Variable Names
- Don't prefix test functions with
test_ - Don't use hungarian notation; prefer shadowing
- ❌:
formats_str→ ✅:formats
Import and Module Style
Imports
Prefer direct imports over fully qualified paths unless ambiguous:
// ✅ Prefer
use client::courier::v1::{Key, cache::ArtifactFile};
let key = Key::from_hex(&hex_string)?;
// ❌ Avoid
let key = client::courier::v1::Key::from_hex(&hex_string)?;
Module Structure
- Do not use
mod.rs. Always prefermy_module.rs+my_module/other_file.rs
String Formatting
Inline rust variables in format strings if possible:
- ✅
format!("Hello, {name}") - Use expressions when needed:
format!("Hello, {}", user.name())
Development Workflow
Dependency Management
- Use
cargo addinstead of manualCargo.tomledits - Run
cargo autoinheritafter adding packages (if workspace uses inheritance)
Code Quality
- Format code:
make format(uses nightly rustfmt) - Run linter:
make check - Auto-fix lints:
make check-fix - Pre-commit checks:
make precommit(runs machete-fix, autoinherit, check-fix, format, sqlx-prepare) - Prefer
Itertools::sortedoverVec::sortfor iterator chains
I/O Operations
Prefer streaming over buffered by default. Use traits: AsyncRead, AsyncWrite, Read, Write
Error Handling
- Use
color-eyrefor errors and reporting - Only panic for invariant violations or in tests
- Prefer returning
Resultfor recoverable errors
Documentation
Don't bold bullet points in markdown:
- ❌
- **Hook**: message - ✅
- Hook: message
Avoid "space dash space" pattern in prose, use colon instead:
- ❌ "All commands work the same way - do x then y"
- ✅ "All commands work the same way: do x then y"
Reference Files
Load these for detailed examples and patterns:
references/indexing-patterns.md- Array indexing alternatives with iterator methodsreferences/naming.md- Complete naming conventions with examplesreferences/control-flow.md- Control flow patterns and examples
When to Use This Skill
Invoke when:
- Writing new Rust code
- Reviewing code for style violations
- Refactoring existing Rust code
- Onboarding to project conventions
Repository
