use std::collections::{BTreeMap, BTreeSet};
use super::topo::topological_order;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub(crate) enum DepKind {
Production,
Dev,
}
#[derive(Debug, Clone)]
pub(crate) struct CrateNode {
#[allow(dead_code)]
pub(crate) name: String,
pub(crate) release_unit: String,
pub(crate) dependencies: BTreeMap<String, DepKind>,
}
#[derive(Debug, Clone)]
pub(crate) struct CrateGraph {
pub(crate) nodes: BTreeMap<String, CrateNode>,
}
impl CrateGraph {
pub(crate) fn topological_order(&self) -> Result<Vec<String>, super::topo::TopoError> {
let edges: BTreeMap<String, BTreeSet<String>> = self
.nodes
.iter()
.map(|(name, node)| (name.clone(), node.dependencies.keys().cloned().collect()))
.collect();
topological_order(&edges)
}
}
#[derive(Debug, Clone)]
pub(crate) struct UnitNode {
#[allow(dead_code)]
pub(crate) name: String,
pub(crate) members: BTreeSet<String>,
pub(crate) dependencies: BTreeMap<String, BTreeSet<String>>,
}
#[derive(Debug, Clone)]
pub(crate) struct UnitGraph {
pub(crate) nodes: BTreeMap<String, UnitNode>,
}
impl UnitGraph {
pub(crate) fn topological_order(&self) -> Result<Vec<String>, super::topo::TopoError> {
let edges: BTreeMap<String, BTreeSet<String>> = self
.nodes
.iter()
.map(|(name, node)| (name.clone(), node.dependencies.keys().cloned().collect()))
.collect();
topological_order(&edges)
}
}