pub mod parser;
pub mod graph;
pub mod analysis;
pub mod impact;
pub mod report;
pub mod cli;
use clap::Parser;
use std::fs;
use crate::cli::Cli;
use crate::parser::parse_cargo_lock;
use crate::graph::DependencyGraph;
use crate::analysis::{find_duplicates, find_optimal_version};
use crate::impact::estimate_impact;
use crate::report::{print_report, VersionSuggestion};
pub fn run() {
let rt = tokio::runtime::Runtime::new().expect("Failed to create Tokio runtime");
rt.block_on(async {
let args = Cli::parse();
let lockfile_contents = fs::read_to_string(&args.lockfile)
.expect("Failed to read lockfile");
let lockfile = parse_cargo_lock(&lockfile_contents)
.expect("Failed to parse lockfile");
let graph = DependencyGraph::from_lockfile(lockfile.package);
let duplicates = find_duplicates(&graph);
let mut suggestions = Vec::new();
for dup in &duplicates {
let recommended = find_optimal_version(&dup.name, &dup.versions).await
.unwrap_or_else(|| "No optimal version found".to_string());
suggestions.push(VersionSuggestion {
recommended_version: recommended,
estimated_saving: 10 * (dup.versions.len() - 1), });
}
let _impact = estimate_impact(&duplicates);
print_report(duplicates, suggestions);
});
}