PluginBench
Skill
Pass
Audit score 90

coding-guidelines

actionbook/rust-skills

Reference for Rust code style, naming conventions, and best practices from 50 core rules.

What is coding-guidelines?

A structured guide to Rust-specific coding conventions covering naming, data types, error handling, memory, concurrency, and async patterns. Use this skill when asking about code style, naming conventions, formatting standards, or best practices in Rust projects.

  • Provides naming conventions for functions, variables, types, and static items
  • Guides data structure choices including newtypes, slices, and pre-allocation strategies
  • Explains string handling best practices and performance considerations
  • Covers error handling patterns including ? propagation and expect() usage
  • Details memory safety practices with lifetimes, RefCell, and shadowing
  • Addresses concurrency patterns including lock ordering, atomics, and memory ordering

How to install coding-guidelines

npx skills add https://github.com/actionbook/rust-skills --skill coding-guidelines
Claude Code
Cursor
Windsurf
Cline

How to use coding-guidelines

  1. 1.Consult the naming section when designing function or variable names
  2. 2.Reference the data types table when choosing collection or wrapper types
  3. 3.Check the deprecated table when encountering older patterns in codebases
  4. 4.Apply the concurrency rules when designing multi-threaded or async code
  5. 5.Use the quick reference for formatting and linting setup

Use cases

Good for
  • Deciding whether to use get_ prefix or direct method names in function design
  • Choosing between as_, to_, and into_ for conversion methods
  • Selecting appropriate error handling between ? propagation, expect(), and unwrap()
  • Determining when to use Cow<str>, String, or &str for string parameters
  • Identifying lock ordering issues to prevent deadlocks in concurrent code
Who it's for
  • Rust developers writing new code or reviewing existing code
  • Teams establishing or enforcing coding standards in Rust projects
  • Developers migrating from other languages to Rust conventions
  • Contributors to Rust projects following community guidelines

coding-guidelines FAQ

Should I use get_ prefix for getter methods?

No. Rust convention is to use the property name directly, e.g., fn name() not fn get_name(). The get_ prefix is reserved for fallible accessors that return Option.

When should I use as_, to_, or into_ for conversions?

Use as_ for cheap conversions that borrow (&), to_ for expensive conversions that may allocate, and into_ for conversions that consume ownership.

What's the difference between expect() and unwrap()?

Use expect() when the value is guaranteed to be present—it lets you document why. Use unwrap() only for prototyping; expect() is preferred for production code.

Should I use lazy_static! or once_cell::Lazy?

Neither. Use std::sync::OnceLock (stable since Rust 1.70) or std::sync::LazyLock (stable since 1.80) instead.

Can I hold locks across await points?

No. Locks held across await can cause deadlocks. Use scoped guards to release locks before awaiting.

Full instructions (SKILL.md)

Source of truth, from actionbook/rust-skills.


name: coding-guidelines description: "Use when asking about Rust code style or best practices. Keywords: naming, formatting, comment, clippy, rustfmt, lint, code style, best practice, P.NAM, G.FMT, code review, naming convention, variable naming, function naming, type naming, 命名规范, 代码风格, 格式化, 最佳实践, 代码审查, 怎么命名" source: https://rust-coding-guidelines.github.io/rust-coding-guidelines-zh/ user-invocable: false

Rust Coding Guidelines (50 Core Rules)

Naming (Rust-Specific)

RuleGuideline
No get_ prefixfn name() not fn get_name()
Iterator conventioniter() / iter_mut() / into_iter()
Conversion namingas_ (cheap &), to_ (expensive), into_ (ownership)
Static var prefixG_CONFIG for static, no prefix for const

Data Types

RuleGuideline
Use newtypesstruct Email(String) for domain semantics
Prefer slice patternsif let [first, .., last] = slice
Pre-allocateVec::with_capacity(), String::with_capacity()
Avoid Vec abuseUse arrays for fixed sizes

Strings

RuleGuideline
Prefer bytess.bytes() over s.chars() when ASCII
Use Cow<str>When might modify borrowed data
Use format!Over string concatenation with +
Avoid nested iterationcontains() on string is O(n*m)

Error Handling

RuleGuideline
Use ? propagationNot try!() macro
expect() over unwrap()When value guaranteed
Assertions for invariantsassert! at function entry

Memory

RuleGuideline
Meaningful lifetimes'src, 'ctx not just 'a
try_borrow() for RefCellAvoid panic
Shadowing for transformationlet x = x.parse()?

Concurrency

RuleGuideline
Identify lock orderingPrevent deadlocks
Atomics for primitivesNot Mutex for bool/usize
Choose memory order carefullyRelaxed/Acquire/Release/SeqCst

Async

RuleGuideline
Sync for CPU-boundAsync is for I/O
Don't hold locks across awaitUse scoped guards

Macros

RuleGuideline
Avoid unless necessaryPrefer functions/generics
Follow Rust syntaxMacro input should look like Rust

Deprecated → Better

DeprecatedBetterSince
lazy_static!std::sync::OnceLock1.70
once_cell::Lazystd::sync::LazyLock1.80
std::sync::mpsccrossbeam::channel-
std::sync::Mutexparking_lot::Mutex-
failure/error-chainthiserror/anyhow-
try!()? operator2018

Quick Reference

Naming: snake_case (fn/var), CamelCase (type), SCREAMING_CASE (const)
Format: rustfmt (just use it)
Docs: /// for public items, //! for module docs
Lint: #![warn(clippy::all)]

Claude knows Rust conventions well. These are the non-obvious Rust-specific rules.