code-buster 0.11.0

Repository-aware static analysis for AI-assisted development
Documentation
use crate::cli::PreviewOptions;
use crate::discovery::prepare;
use crate::duplication;

pub fn execute(options: &PreviewOptions) -> Result<(), String> {
    let prepared = prepare(options)?;
    let duplicate_count = if duplicate_rule_enabled(options, &prepared.config) {
        duplication::exact_group_count(&prepared.sources, prepared.config.min_duplication_lines)
    } else {
        0
    };

    println!("Code Buster doctor");
    println!(
        "- Hidden directories are skipped by default; use explicit includes only if you want to analyze hidden tooling/vendor folders."
    );
    if !prepared.coverage.is_empty() {
        let coverage = prepared
            .coverage
            .iter()
            .map(|(reason, count)| format!("{reason}={count}"))
            .collect::<Vec<_>>()
            .join(" ");
        println!("- Coverage: {coverage}");
    }
    if duplicate_count > 20 {
        println!(
            "- There are many duplicate-block findings; consider raising min_duplication_lines above {}.",
            prepared.config.min_duplication_lines
        );
    }
    if prepared.files.is_empty() {
        println!("- No source files were discovered; check --root, --lang, and ignore_patterns.");
    }
    Ok(())
}

fn duplicate_rule_enabled(options: &PreviewOptions, config: &crate::config::Config) -> bool {
    options.only == "duplicate-block"
        && !config.disabled_rules.contains("duplicate-block")
        && config
            .rule_modes
            .get("duplicate-block")
            .is_none_or(|mode| mode != "off")
        && config
            .group_modes
            .get("maintainability")
            .is_none_or(|mode| mode != "off")
}