pub struct Rule {Show 25 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 autofix_safe: 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.
autofix_safe: boolOpt-in marker that this rule’s rewrite is safe to apply automatically
(idempotent, no semantic change). scan --fix ignores the rewrite of
any rule without it. 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_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 is_autofixable(&self) -> bool
pub fn is_autofixable(&self) -> bool
Whether scan --fix may rewrite this rule’s matches: it carries a
rewrite template and is explicitly marked autofix_safe. An external
(non-builtin) rule additionally needs its id in fix.allow_external,
which scan --fix checks on top of this.
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