archunit/slices/uml/
plantuml_diagram.rsuse std::collections::BTreeSet;
use super::plantuml_dependency::validated_component_name;
use super::{PlantUmlDependency, PlantUmlError};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PlantUmlDiagram {
pub components: Vec<String>,
pub dependencies: Vec<PlantUmlDependency>,
}
impl PlantUmlDiagram {
pub fn new<C, D>(components: C, dependencies: D) -> Result<Self, PlantUmlError>
where
C: IntoIterator<Item = String>,
D: IntoIterator<Item = PlantUmlDependency>,
{
let mut unique_dependencies = BTreeSet::new();
let dependencies = dependencies
.into_iter()
.filter(|dependency| unique_dependencies.insert(dependency.clone()))
.collect::<Vec<_>>();
let mut names = Vec::new();
let mut unique_names = BTreeSet::new();
for component in components.into_iter().chain(
dependencies
.iter()
.flat_map(|dependency| [dependency.source.clone(), dependency.target.clone()]),
) {
let component = validated_component_name(component)?;
if unique_names.insert(component.clone()) {
names.push(component);
}
}
Ok(Self {
components: names,
dependencies,
})
}
#[must_use]
pub fn allows(&self, source: &str, target: &str) -> bool {
self.dependencies
.iter()
.any(|dependency| dependency.source == source && dependency.target == target)
}
}