pub struct Rule {Show 27 fields
pub id: RuleId,
pub language: Language,
pub severity: Severity,
pub message: String,
pub note: Option<String>,
pub category: Option<Category>,
pub fix: Option<String>,
pub rewrite: Option<String>,
pub fixer: Option<FixerKind>,
pub autofix_safe: bool,
pub autofix_unsafe: bool,
pub autofix_rule: Value,
pub rule: Value,
pub constraints: Value,
pub metric: Option<Metric>,
pub threshold: Option<f64>,
pub min_lines: Option<usize>,
pub cross_file: Option<CrossFileKind>,
pub resolution: Option<ResolutionKind>,
pub source_dir: Option<PathBuf>,
pub origin: RuleOrigin,
pub files: Option<Vec<String>>,
pub ignores: Option<Vec<String>>,
pub enabled: bool,
pub skip_test_code: bool,
pub tests: Option<RuleTests>,
pub ai_check: Option<AiCheck>,
}Fields§
§id: RuleId§language: Language§severity: Severity§message: String§note: Option<String>§category: Option<Category>§fix: Option<String>§rewrite: Option<String>ast-grep rewrite (fix) template applied to this rule’s match by
scan --fix. Distinct from fix, which is a free-text human message:
rewrite carries the replacement pattern (it may reference the rule’s
metavariables). The AST detection pass never reads this field.
fixer: Option<FixerKind>Builtin fixer applied by scan --fix instead of a rewrite template,
for rewrites that edit several nodes (an item and its attributes, two
match arms) or read another file. Mutually exclusive with rewrite. The
kind selects builtin Rust logic, so an unknown name is a parse error.
autofix_safe: boolOpt-in marker that this rule’s rewrite (or fixer) is safe to apply
automatically (idempotent, no semantic change). scan --fix ignores the
rewrite of any rule without it or autofix_unsafe. Defaults to false.
On a rule from custom_dirs or [[rules.sources]] it is not enough:
the rule id must also be listed in the user config’s
fix.allow_external.
autofix_unsafe: boolOpt-in marker for a rewrite that deliberately changes behavior (it
recovers a poisoned lock instead of panicking, it lets a derived
Display honor width flags). Applied only by scan --fix --unsafe-fixes. Mutually exclusive with autofix_safe.
autofix_rule: ValueMatcher used only by scan --fix to locate nodes to rewrite, when it must
be narrower than the detection rule (detect broadly, fix narrowly). A
rule can flag every variant of a pattern while auto-rewriting only the
subset whose rewrite is provably safe. null (the default) means
--fix reuses rule. The detection pass never reads this field.
--fix only rewrites an autofix_rule match whose range lies inside a
match of the detection rule (with its constraints), so it can narrow
but never widen what detection reports.
rule: Value§constraints: Valueast-grep metavariable constraints, a sibling of rule. Passed through
verbatim so a rule can restrict a captured metavariable (e.g. bind the
receiver of $R.clone() to an already-owned value). null when unset.
metric: Option<Metric>File-level metric evaluated instead of rule. Mutually exclusive with it.
threshold: Option<f64>The value metric must exceed for the rule to fire. Required with metric.
min_lines: Option<usize>Minimum file length in lines before a metric rule is evaluated. Below it
the file is skipped, so ratios are not distorted by tiny files (a small
module full of required doc comments). None means no floor.
cross_file: Option<CrossFileKind>Project-wide analysis evaluated instead of rule or metric, and
mutually exclusive with both. The kind selects builtin Rust logic; the
YAML only carries the rule’s identity, severity and user-facing text.
resolution: Option<ResolutionKind>Per-file import resolution evaluated instead of rule, metric or
cross_file, and mutually exclusive with all three. The kind selects
builtin resolution logic; the YAML only carries the rule’s identity,
severity and user-facing text. $import in message is replaced with
the unresolved specifier.
source_dir: Option<PathBuf>Directory a custom rule was loaded from, used to resolve test fixture
paths. None for builtin rules, which resolve against BuiltinRules.
origin: RuleOriginProvenance of this rule (builtin, git source, or local path), stamped at
load time and reported by slopguard list. Never present in YAML.
files: Option<Vec<String>>§ignores: Option<Vec<String>>§enabled: boolDrop findings located inside #[cfg(test)] blocks of scanned Rust files.
Complements ignores, which only filters whole files by path.
skip_test_code: bool§tests: Option<RuleTests>§ai_check: Option<AiCheck>When set, matches of rule are candidates confirmed by an LLM before
being reported. See AiCheck. The AST scanner ignores this field.
Implementations§
Source§impl Rule
impl Rule
Sourcepub fn effective_category(&self) -> Category
pub fn effective_category(&self) -> Category
The rule’s category, resolving an unset category to the default
(Correctness), the way the scanner treats it.
Sourcepub fn is_metric(&self) -> bool
pub fn is_metric(&self) -> bool
Whether this rule measures a file-level metric instead of matching AST.
Sourcepub fn metric_spec(&self) -> Option<(Metric, f64)>
pub fn metric_spec(&self) -> Option<(Metric, f64)>
The metric and threshold of a file-level rule, None for AST rules.
Sourcepub fn is_cross_file(&self) -> bool
pub fn is_cross_file(&self) -> bool
Whether this rule is evaluated by the project-wide pass instead of per file.
Sourcepub fn is_resolution(&self) -> bool
pub fn is_resolution(&self) -> bool
Whether this rule is evaluated by the per-file import resolution pass.
Sourcepub fn fix_safety(&self) -> Option<FixSafety>
pub fn fix_safety(&self) -> Option<FixSafety>
How safe this rule’s autofix is: None when scan --fix never rewrites
its matches (no rewrite or fixer, or neither autofix_safe nor
autofix_unsafe). An external (non-builtin) rule additionally needs its
id in fix.allow_external, which scan --fix checks on top of this.
Sourcepub fn is_autofixable(&self) -> bool
pub fn is_autofixable(&self) -> bool
Whether scan --fix may rewrite this rule’s matches at some safety level.
Sourcepub fn fix_matcher(&self) -> &Value
pub fn fix_matcher(&self) -> &Value
The matcher scan --fix uses to find nodes to rewrite: the dedicated
autofix_rule when set, otherwise the detection rule.
Sourcepub fn cross_file_kind(&self) -> Option<CrossFileKind>
pub fn cross_file_kind(&self) -> Option<CrossFileKind>
The cross-file analysis this rule requests, None for AST and metric rules.
Sourcepub fn resolution_kind(&self) -> Option<ResolutionKind>
pub fn resolution_kind(&self) -> Option<ResolutionKind>
The resolution analysis this rule requests, None for all other rules.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Rule
impl<'de> Deserialize<'de> for Rule
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for Rule
impl RefUnwindSafe for Rule
impl Send for Rule
impl Sync for Rule
impl Unpin for Rule
impl UnsafeUnpin for Rule
impl UnwindSafe for Rule
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more