use std::collections::{HashMap, HashSet};
#[derive(Debug, Clone)]
pub struct SchemaDependencyGraph {
pub(super) outgoing: HashMap<String, HashSet<String>>,
pub(super) incoming: HashMap<String, HashSet<String>>,
pub(super) all_types: HashSet<String>,
pub(super) root_types: HashSet<String>,
}
impl SchemaDependencyGraph {
#[must_use]
pub fn dependencies_of(&self, type_name: &str) -> Vec<String> {
self.outgoing
.get(type_name)
.map(|deps| {
let mut v: Vec<_> = deps.iter().cloned().collect();
v.sort();
v
})
.unwrap_or_default()
}
#[must_use]
pub fn dependents_of(&self, type_name: &str) -> Vec<String> {
self.incoming
.get(type_name)
.map(|refs| {
let mut v: Vec<_> = refs.iter().cloned().collect();
v.sort();
v
})
.unwrap_or_default()
}
#[must_use]
pub fn all_types(&self) -> Vec<String> {
let mut types: Vec<_> = self.all_types.iter().cloned().collect();
types.sort();
types
}
#[must_use]
pub fn type_count(&self) -> usize {
self.all_types.len()
}
#[must_use]
pub fn has_type(&self, type_name: &str) -> bool {
self.all_types.contains(type_name)
}
}