use std::collections::{HashMap, HashSet};
use crate::command_add::models::ResolvedComponent;
pub fn print_dependency_tree(resolved: &HashMap<String, ResolvedComponent>) {
println!("Dependency Tree Resolution:");
let mut dependent_components = HashSet::new();
for (_, resolved_comp) in resolved {
for dep in &resolved_comp.resolved_registry_dependencies {
dependent_components.insert(dep.clone());
}
}
for (name, _) in resolved {
if !dependent_components.contains(name) {
print_component_tree(name, resolved, resolved, 0);
}
}
}
fn print_component_tree(
component_name: &str,
all_resolved: &HashMap<String, ResolvedComponent>,
current_branch: &HashMap<String, ResolvedComponent>,
depth: usize,
) {
if let Some(component) = current_branch.get(component_name) {
let indent = " ".repeat(depth);
println!("{}└─ {} ({})", indent, component_name, component.component.parent_dir);
let filtered_cargo_deps: Vec<&String> = component
.component
.cargo_dependencies
.iter()
.filter(|&dep| dep != "std")
.collect();
if !filtered_cargo_deps.is_empty() {
let cargo_indent = " ".repeat(depth + 1);
println!("{}└─ Cargo Dependencies:", cargo_indent);
let mut cargo_deps = filtered_cargo_deps;
cargo_deps.sort();
for cargo_dep in cargo_deps {
let cargo_dep_indent = " ".repeat(depth + 2);
println!("{}└─ {}", cargo_dep_indent, cargo_dep);
}
}
let mut deps: Vec<&String> = component.component.registry_dependencies.iter().collect();
deps.sort();
for dep_name in deps {
if all_resolved.contains_key(dep_name) {
print_component_tree(dep_name, all_resolved, all_resolved, depth + 1);
} else {
let indent = " ".repeat(depth + 1);
println!("{}└─ {} (external)", indent, dep_name);
}
}
}
}