use governor_core::domain::dependency::{DependencyGraph, WorkspaceDependency};
pub use super::metadata::PackageInfo;
#[must_use]
pub fn build_dependency_graph(packages: &[PackageInfo]) -> DependencyGraph {
let mut graph = DependencyGraph::new();
for pkg in packages {
for dep in &pkg.dependencies {
graph.add(WorkspaceDependency::new(
pkg.name.clone(),
dep.clone(),
"workspace".to_string(),
));
}
}
graph
}
#[must_use]
pub fn get_publish_order(dep_graph: &DependencyGraph, has_cycles: bool) -> Vec<String> {
if has_cycles {
Vec::new()
} else {
dep_graph.publish_order().unwrap_or_default()
}
}
#[must_use]
pub fn get_dependencies_for(graph: &DependencyGraph, crate_name: &str) -> Vec<String> {
graph
.dependencies_for(crate_name)
.iter()
.map(|d| d.to.clone())
.collect()
}
#[must_use]
pub fn get_graph_stats(dep_graph: &DependencyGraph, has_cycles: bool) -> (usize, usize, i32) {
let all_crates = dep_graph.all_crates();
let nodes = all_crates.len();
let edges = dep_graph.dependencies.len();
let cycles = i32::from(has_cycles);
(nodes, edges, cycles)
}