cargo-governor 2.0.0

Machine-First, LLM-Ready, CI/CD-Native release automation tool for Rust crates
Documentation
//! Dependency graph operations for plan service

use governor_core::domain::dependency::{DependencyGraph, WorkspaceDependency};

// Re-export PackageInfo from metadata for use in this module
pub use super::metadata::PackageInfo;

/// Build dependency graph from packages
#[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
}

/// Get publication order from dependency 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()
    }
}

/// Get dependencies for a specific crate
#[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()
}

/// Get graph statistics
#[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)
}