use crate::analysis::Analyzer;
use crate::cli::output::OutputWriter;
use crate::cli::AnalyzeArgs;
use crate::config::Config;
use crate::core::Result;
use indicatif::{ProgressBar, ProgressStyle};
use std::path::Path;
use std::time::Instant;
pub fn run_analyze(args: &AnalyzeArgs, path: &Path, config: &Config, verbose: bool) -> Result<i32> {
let start = Instant::now();
let progress = if args.progress {
let pb = ProgressBar::new_spinner();
pb.set_style(
ProgressStyle::default_spinner()
.template("{spinner:.cyan} {msg}")
.unwrap(),
);
pb.set_message("Discovering files...");
Some(pb)
} else {
None
};
let mut analyzer = Analyzer::new(config.clone(), path.to_path_buf())?;
if let Some(ref pb) = progress {
pb.set_message("Parsing files...");
}
let result = analyzer.analyze(progress.as_ref())?;
if let Some(pb) = progress {
pb.finish_and_clear();
}
let duration = start.elapsed();
let min_confidence = args.confidence.to_confidence();
let filtered_dead = result.filter_by_confidence(min_confidence);
let mut writer = OutputWriter::new(args.format.into(), verbose);
writer.write_result(&result, &filtered_dead, args.show_chains)?;
if !args.check {
let (high, medium, low) = result.count_by_confidence();
eprintln!();
eprintln!(
"Analyzed {} symbols in {} files ({:.2}s)",
result.total_symbols,
result.total_files,
duration.as_secs_f64()
);
eprintln!(
"Dead code: {} high, {} medium, {} low confidence",
high, medium, low
);
}
for warning in &result.warnings {
eprintln!("Warning: {}", warning.message);
}
if args.check && !filtered_dead.is_empty() {
Ok(1)
} else {
Ok(0)
}
}