rustcop 0.1.5

A Rust style linter and formatter inspired by C#'s StyleCop
Documentation

RustCop

An experimental Rust style linter and formatter inspired by C#'s StyleCop.

RustCop checks and auto-fixes style violations in your Rust source files, starting with import statement formatting.

Installation

cargo install rustcop

Usage

Check for violations

cargo rustcop check [paths...]

Scans .rs files and reports style violations without modifying anything. Exits with code 1 if any diagnostics are found.

Auto-fix violations

cargo rustcop fix [paths...]

Fixes violations in-place and runs a verification pass to confirm everything is clean.

If no paths are given, both commands default to the current directory.

Options

Flag Description
-c, --config <FILE> Path to the config file (default: rustcop.toml)

Configuration

Create a rustcop.toml in your project root:

version = 1

# When true, warnings are treated as errors (default: false)
treat_warnings_as_errors = false

# When true, suppression directives must include justifications (default: true)
require_suppression_justification = true

[imports]
enabled = true
group = true    # Group imports: std → external → crate/self/super
sort = true     # Sort imports alphabetically within each group
merge = true    # Merge imports from the same crate into one `use` block

Suppression Directives

RustCop supports both comment-based and attribute-based suppression directives, similar to C#'s [SuppressMessage].

Comment-Based Suppressions

// Suppress all rules for the entire file
// rustcop:ignore-file

// Suppress all rules for the next line
// rustcop:ignore
fn my_function() { }

// Suppress a specific rule with justification (recommended)
// rustcop:ignore RC1001: Legacy code, will refactor in v2.0
fn another_function() { }

// Suppress multiple rules with a shared justification
// rustcop:ignore RC1001, RC1002: Performance critical section
fn performance_function() { }

// Stack multiple suppressions for different justifications per rule
// rustcop:ignore RC1001: Reason for RC1001
// rustcop:ignore RC1002: Reason for RC1002
fn complex_function() { }

Attribute-Based Suppressions

// Suppress all rules for a function
#[rustcop::ignore]
fn my_function() { }

// Suppress a specific rule with justification
#[rustcop::ignore(RC1001, justification = "Legacy API compatibility")]
fn another_function() { }

// Stack multiple attributes for different justifications per rule
#[rustcop::ignore(RC1001, justification = "Performance optimization")]
#[rustcop::ignore(RC1002, justification = "Required for backwards compatibility")]
fn complex_function() { }

// Suppress at module level
#![rustcop::ignore]

The attribute macro is re-exported from the main rustcop crate:

use rustcop::ignore;

#[rustcop::ignore]
fn my_function() { }

See examples/suppression_demo.rs for more examples.

Structured Output

RustCop can output diagnostics in machine-readable formats:

# Generate SARIF output
cargo rustcop check --out results.sarif

# Generate JSON output
cargo rustcop check --out results.json

The format is automatically detected from the file extension. SARIF v2.1.0 is supported.

Rules

ID Name Description
RC1001 ImportFormatting Groups, sorts, and merges use statements
RC2001 DisallowSuperImports Reports use of super:: imports when configured
RC9001 UnusedSuppression Reports suppression directives that don't suppress any diagnostics
RC9002 MissingSuppressionJustification Reports suppressions without justifications when require_suppression_justification = true

Import formatting follows rustfmt conventions:

  • Grouping — standard library first, then third-party crates, then internal (crate/self/super), separated by blank lines.
  • Sorting — alphabetical within each group.
  • Merging — multiple imports from the same crate are combined into a single use block.
  • Multi-line expansion — imports with nested braces are expanded to one item per line.

Unused Suppression Detection: RustCop generates an error (RC9001) for any suppression directive that doesn't actually suppress any diagnostics. This helps keep your codebase clean by detecting:

  • Suppressions added for issues that have since been fixed
  • Suppressions targeting the wrong line or rule
  • Suppressions for rules that don't exist or aren't enabled

Suppression Justification Enforcement: When require_suppression_justification = true in your config, RustCop generates an error (RC9002) for any suppression that lacks a justification comment. This helps maintain documentation of why rules are being suppressed.

Super Import Validation: When [lints.disallow_super_imports] is configured with severity = "error", RustCop generates an error (RC2001) for any use of super:: imports. This can be useful for enforcing explicit import paths.

License

Licensed under either of

at your option.