full-stack-skills/rust-skills

rust-style-clippy

Apply and diagnose Rust style, rustfmt, Clippy, compiler diagnostics, Edition migrations, lint policy, idiomatic control flow, error handling, allocation behavior, production Rust conventions, and the Rust API Guidelines ↔ Clippy lint mapping.

View source
Original skill document

Rendered from the source repository. Headings, examples, code, tables, links, and referenced images are preserved.

Rust Style Formatting and Static Analysis

Based on the `rustfmt Book`, `Clippy Book`, `Edition Guide`, and `Error Code Index`.

Capability Boundaries

✅ Strengths

  1. Stable rustfmt configuration (edition, maxwidth, tabspaces, usefieldinit_shorthand, etc.)
  2. Clippy lint system — all 10 lint groups: correctness, suspicious, style, complexity, perf, pedantic, restriction, cargo, nursery, internal
  3. clippy.toml configuration (msrv, arithmetic-side, cognitive-complexity-threshold, avoid-breaking-exported-api, etc.)
  4. #[expect(...)] attribute (Rust 1.81+) for CI-enforced lint expectations
  5. Lint priority ordering for layered policy
  6. Production CI lint policy (deny/warn/allow decisions per group)
  7. Edition migration (2015→2018→2021→2024, key changes per edition and cargo fix commands)
  8. Compiler error code interpretation (rustc --explain, common error codes reference table)

⚠️ Prerequisites

  1. Rust toolchain installed and configured

❌ Out of Scope

  1. Rust syntax basics → Use rust-stable skill
  2. Code review → Use rust-code-review skill
  3. API shape design (naming, type/trait design, module layout) and the full ~100 C- API Guidelines checklist → Use the `rust-api-design` skill. This skill only maps the ~25 C- rules that Clippy can mechanically enforce; the rest are design decisions.

When to Use

  • "Format Rust code"
  • "Run Clippy"
  • "Migrate to a new Edition"
  • "What does compiler error E0xxx mean?"

I. rustfmt Configuration

toml
# .rustfmt.toml
max_width = 100                    # Line width (default: 100)
tab_spaces = 4                     # Indentation spaces
edition = "2024"                   # Rust edition
merge_derives = true               # Merge derives
use_field_init_shorthand = true    # Field initialization shorthand
use_try_shorthand = true            # Use ? shorthand
bash
cargo fmt                           # Format all files
cargo fmt --check                   # Check formatting (CI usage)
cargo fmt -- --config max_width=80  # Apply specific configuration

Options such as imports_granularity, group_imports, and reorder_impl_items may still require nightly rustfmt; do not include them in default configurations that must pass stable CI.

II. Clippy

bash
cargo clippy                              # Default: correctness, suspicious, style, complexity, perf
cargo clippy -- -W clippy::pedantic       # Enable pedantic group
cargo clippy --fix                        # Auto-fix MachineApplicable lints
cargo clippy -- -A clippy::module_inception  # Allow a specific lint

All 10 lint groups

GroupDefault levelDescriptionHigh-leverage lints
correctnessdeny (effectively)Code that is wrong — broken semanticsalmost_swap, drop_non_drop, if_same_then_else, out_of_bounds_looping, ptr_offset_with_cast
suspiciouswarnLikely-buggy code that compiles but smells offmutable_key_type, assign_op_pattern, blqcklisted_name, cast_lossless, clone_on_ref_ptr
stylewarn (default group)Idiomatic Rust stylistic preferencesenum_variant_names, new_without_default, wrong_self_convention, needless_return, module_inception
complexitywarnCode that could be simplertoo_many_arguments, cognitive-complexity, manual_flatten, option_option
perfwarnPerformance hints (allocations, copies)large_enum_variant, single_char_pattern, manual_memcpy, vec_box, derivable_impls
pedanticallow (opt-in)Opinionated style — stricter than stylecast_possible_truncation, fn_params_excessive_bools, must_use_candidate, missing_errors_doc, module_name_repetitions
restrictionallow (opt-in)Forbid patterns that may be intentional but riskyunwrap_used, expect_used, panic, indexing_slicing, dbg_macro, print_stdout, float_arithmetic
cargowarnCargo.toml qualitycargo_common_metadata, negative_feature_names, redundant_feature_names, wildcard_dependencies
nurseryallow (experimental)Lints under developmentuse_self, fallible_impl_from, missing_const_for_fn
internalallowFor Clippy's own development(rarely used by users)

#[expect] attribute (Rust 1.81+) — better than #[allow]

rust
// ✅ #[expect] — CI fails if the lint stops firing, surfacing dead expectations
#[expect(clippy::too_many_arguments, reason = "configurable builder has many options")]
fn build(name: &str, retries: u32, timeout: u32, /* 5 more */) { /* */ }

// ❌ #[allow] — silently becomes dead code if the lint stops firing
#[allow(clippy::too_many_arguments)]
fn build(/* */) { /* */ }

Prefer #[expect] for intentional suppressions; reserve #[allow] for transient reasons.

Lint priority — layering

rust
// Higher priority wins. Use for layered policy.
#![warn(clippy::pedantic)]                       // enable pedantic (priority 0)
#![warn(priority = 1, clippy::module_name_repetitions)]  // re-enable a specific lint

clippy.toml configuration

toml
# clippy.toml at workspace root
msrv = "1.85"                                  # Don't suggest APIs newer than MSRV
avoid-breaking-exported-api = false            # Suggest fixes that change public API
cognitive-complexity-threshold = 25            # Function complexity limit
arithmetic-side = "checked"                    # Prefer checked_* arithmetic
enum-variant-name-threshold = 1                # Trigger variant_name lint
single-char-binding-names-threshold = 3        # Allow `_a`, `_b`, but not 4+
too-many-arguments-threshold = 7
type-complexity-threshold = 250
disallowed-methods = [
    { path = "std::env::var", reason = "use our config::get instead" },
]
disallowed-types = [
    { path = "std::collections::LinkedList", reason = "almost never the right choice" },
]
disallowed-macros = [
    { path = "std::println", reason = "use tracing in libraries" },
]

See references/clippy-lint-policy.md for the full clippy.toml reference and production policies.

Production CI lint policy

Different projects need different strictness. See references/clippy-lint-policy.md for ready-to-paste configurations.

Project typePedanticRestrictionRecommended
Library (published)warnallowclippy::all + clippy::pedantic warn + cargo::cargo_common_metadata deny
Application / binarywarnwarn (unwrap_used)Add restriction::unwrap_used, panic, indexing_slicing
Embedded / safety-criticalwarndenyAll restriction lints deny; add float_arithmetic deny
Internal toolallowallowJust clippy::all (default groups)

III. Edition Migration

bash
# Check current edition
cargo metadata --format-version 1 | jq '.packages[0].edition'

# Migration steps (example: 2021 → 2024)
cargo fix --edition               # Auto-migrate code
cargo build                       # Verify compilation
cargo test                        # Validate functionality

# Update Cargo.toml
# edition = "2024"

Key changes per edition:

EditionKey Changes
2015→2018Path and module import changes, dyn Trait, NLL, anonymous lifetimes and keywords changed
2018→2021Precise closure capture, array IntoIterator, panic macro consistency, prelude and reserved syntax changes
2021→2024RPIT lifetime capture, match ergonomics adjustment, temporary value scope, unsafe extern/unsafe attributes, gen keyword, etc.

IV. Compiler Error Code Quick Reference

bash
# View error details
rustc --explain E0277
Error CodeMeaningTypical Scenario
E0277Trait not implementedT: Trait bound is unsatisfied
E0308Type mismatchExpected type A, but B provided
E0502Borrow conflictCannot have mutable borrow and immutable borrow simultaneously
E0597Insufficient lifetimesReference goes out of scope beyond its lifetime value
E0432Import not founduse path is incorrect
E0061Parameter count mismatchFunction call has wrong number of parameters
E0106Missing lifetimesFunction signature requires explicit lifetimes
E0382Use moved valueOwnership already transferred
E0499Simultaneous mutable borrowOnly one &mut allowed per expression
E0716Insufficient lifetime for temporary valuesReference on temporary exceeds its scope

V. API Guidelines ↔ Clippy Lints

The Rust API Guidelines checklist uses C-* rules (about 100 total). Clippy mechanically enforces roughly 25 of them; the remaining ~75 are design judgments (naming, type/trait shape, module layout) that belong to the rust-api-design skill, or require cargo-semver-checks for breaking-change detection. The table below lists the 12 highest-leverage mappings reviewers ask about most. The full crosswalk, including "lints not yet covered" guidance, lives in `references/api-guidelines-to-clippy.md`.

C-* RuleClippy LintGroupEffect
C-UNWRAPclippy::unwrap_usedrestrictionFlags unwrap() calls
C-UNWRAPclippy::expect_usedrestrictionFlags expect() calls
C-PANICclippy::panicrestrictionFlags panic!()
C-INDEXINGclippy::indexing_slicingrestrictionFlags [i] indexing (panics)
C-BOOL-ARGclippy::fn_params_excessive_boolspedanticFunctions with ≥3 bool params
C-NEWTYPEclippy::new_without_defaultstylenew() exists but no Default
C-NEWTYPEclippy::new_ret_no_selfstylenew() returns non-Self
C-CONV / C-WRONG-SELFclippy::wrong_self_conventionstyleas_X(self) taking &self, or to_X(&self) consuming self
C-STRING-PATTERNSclippy::single_char_patternperf.contains("a").contains('a')
C-COMMON-TRAITSclippy::derivable_implsperfManual impl that could be derived
C-LARGE-NUMERICclippy::unreadable_literalstyle1000000 should be 1_000_000
C-MUTABLE-KEYclippy::mutable_key_typesuspiciousHashMap key type is mutable
C-CLONE-ON-REFclippy::clone_on_ref_ptrrestriction.clone() on Rc/Arc

Many restriction and pedantic lints are off by default — enable them explicitly via #![warn(clippy::unwrap_used)] or in clippy.toml when enforcing a guideline in CI.

Workflow

  1. Format code — cargo fmt ensures consistent style
  2. Run Clippy — cargo clippy runs the 5 default groups (correctness, suspicious, style, complexity, perf); add -W clippy::pedantic for stricter
  3. Decide policy — pick pedantic/restriction level by project type (see table above); paste the matching config from references/clippy-lint-policy.md
  4. Configure clippy.toml — set msrv, disallowed-methods, and any project-specific thresholds
  5. Use #[expect] for intentional suppressions — keeps CI honest about dead expectations
  6. Check Edition — Confirm edition in Cargo.toml is up-to-date
  7. CI integration — cargo fmt --check + cargo clippy -- -D warnings + cargo audit in CI

Gotchas

  1. cargo clippy --fix only fixes lints at MachineApplicable level
  2. rustfmt config file is named .rustfmt.toml, not rustfmt.toml
  3. After edition migration, new warnings may appear — especially around unsafeopinunsafefn in 2024
  4. cargo fix --edition does not fix all issues; manual review required after migration
  5. Prefer let ... else for early exits and is_some_and/then_some for simple boolean mapping; avoid compressing complex control flows just to use modern syntax
  6. saturating_*, checked_*, and regular arithmetic expressions have different business semantics regarding overflow strategy — decide first, then select API

On-Demand Resources

  • Format and Clippy Examples
  • Lint Group Quick Reference
  • Clippy Lint Policy: Full clippy.toml reference, all 10 lint groups in depth, #[expect] patterns, priority layering, and ready-to-paste production CI configurations by project type.
  • Production Rust Idioms: Review let-else, Option combinators, newtype patterns, non-exhaustive APIs, lock scopes, and overflow strategies when reviewing production code.
  • API Guidelines ↔ Clippy Lints Crosswalk: Full mapping from Rust API Guidelines C-* rules to the Clippy lints that enforce them, plus the ~75 rules Clippy does not cover and where to review them.
  • examples/golden-style/: Golden examples for CI passing rustfmt and Clippy

Official References

from this repository

More skills

All skills
full-stack-skills
Community

rust-api-design

Design Rust library APIs that follow the Rust API Guidelines — naming (C-CASE, C-CONV, C-GETTER), interop traits (C-COMMON-TRAITS, C-CONVERT, C-ITER, C-SERDE), predictability (C-INTUITIVE, C-CONST), flexibility (C-GENERIC, C-NEWTYPE, C-EXT), type safety (C-BOOL, C-NONZERO, C-WRAPPER, C-STR), dependability (C-PANIC, C-UNWRAP), debuggability (C-DEBUG), and future-proofing (C-SEALED, C-STRUCT-FIELD, C-NON-EXHAUSTIVE). Use when users design a public crate API, choose between generics/concrete/newtype, decide trait bounds, hide implementation, avoid breakage, or ask "what is idiomatic Rust API design"; hand semver and publish workflow to rust-semver, lint config to rust-style-clippy, and in-crate layout to rust-module-layout.

installs
1
GitHub stars
5
Updated
Sep 19
full-stack-skills
Community

rust-by-example

Show Rust patterns through short compilable examples — type conversions (From/Into/TryFrom/as/Deref), flow control (if let/while let/match/loop), functions and closures (Fn/FnMut/FnOnce, captures), modules (mod/use/pub/super/self), generics and traits (bounds/associated types/trait objects), error handling (?/Result/thiserror/anyhow), attributes (derive/cfg/inline/allow), unsafe (raw pointers/unions/ABI), procedural macros (derive/attribute/function-like), and inline asm. Use when users ask "how do I write X in Rust", need a concrete pattern with copy-pasteable code, or are migrating from Java/Python/Go/C++ and want the Rust equivalent; hand architecture decisions to rust-api-design/rust-workspace, std API selection to rust-stdlib, and async runtime to rust-concurrency.

installs
1
GitHub stars
5
Updated
Sep 19
full-stack-skills
Community

rust-cargo-build

Configure, operate, diagnose, and automate Cargo for Rust packages and workspaces. Cover manifests and targets, commands, dependency resolution and features, profiles, build scripts, configuration and environment variables, caches and build diagnostics, cross-compilation, registries, packaging, publishing, metadata, CI reproducibility, and stable-versus-nightly feature gates. Use for Cargo.toml, Cargo.lock, .cargo/config.toml, cargo build/check/run/tree/metadata/package/publish, resolver or feature problems, build output and performance, private registries, and beginner Cargo workflows. Route crate selection and supply-chain audits to rust-dependencies, workspace topology to rust-workspace, test design to rust-testing, documentation design to rust-documentation, lint policy to rust-style-clippy, and API compatibility decisions to rust-semver.

installs
1
GitHub stars
5
Updated
Sep 19
full-stack-skills
Community

rust-cli

Design, implement, test, and release production Rust command-line applications, including command contracts, subcommands, configuration precedence, stdin/stdout/stderr, exit codes, file safety, daemon IPC, terminal handling, packaging, and process-level tests. Use when users ask for a Rust CLI, command parser, clap integration, Unix-style pipelines, daemon clients, PTY/TUI behavior, shell completion, or CLI release engineering.

installs
1
GitHub stars
5
Updated
Sep 19