Skip to main content

cuke_dedup/
analysis.rs

1//! Rule evaluation over the shared step-definition representation.
2
3mod evidence;
4mod pairs;
5mod similarity;
6mod suppression;
7mod usage;
8
9use crate::config::Config;
10use crate::model::{AnalysisResult, FeatureStep, StepDefinition};
11use anyhow::Result;
12
13pub(crate) fn unmatched_suppressions(
14    config: &Config,
15    definitions: &[StepDefinition],
16) -> Vec<usize> {
17    suppression::unmatched_suppressions(config, definitions)
18}
19
20/// Evaluates every configured rule against extracted definitions and feature steps.
21pub fn analyze(
22    definitions: Vec<StepDefinition>,
23    feature_steps: Vec<FeatureStep>,
24    config: &Config,
25) -> Result<AnalysisResult> {
26    let mut findings = Vec::new();
27    pairs::analyze_definition_pairs(&definitions, config, &mut findings)?;
28    let used = usage::analyze_feature_usage(&definitions, &feature_steps, config, &mut findings);
29    usage::analyze_unused(&definitions, &used, config, &mut findings);
30    findings.sort_by(|left, right| {
31        left.primary
32            .path
33            .cmp(&right.primary.path)
34            .then(left.primary.line.cmp(&right.primary.line))
35            .then(left.primary.column.cmp(&right.primary.column))
36            .then(left.rule.cmp(&right.rule))
37    });
38    Ok(AnalysisResult {
39        definitions,
40        feature_steps,
41        findings,
42    })
43}
44
45#[cfg(test)]
46mod tests;