use std::collections::HashMap;
use mig_types::schema::mig::{MigSchema, MigSegment, MigSegmentGroup};
#[derive(Clone, serde::Serialize, serde::Deserialize)]
pub struct SegmentStructure {
pub(crate) element_counts: HashMap<String, usize>,
}
impl SegmentStructure {
pub fn from_mig(mig: &MigSchema) -> Self {
let mut element_counts = HashMap::new();
for seg in &mig.segments {
Self::register_segment(&mut element_counts, seg);
}
for group in &mig.segment_groups {
Self::walk_group(&mut element_counts, group);
}
Self { element_counts }
}
pub fn element_count(&self, tag: &str) -> Option<usize> {
self.element_counts.get(&tag.to_uppercase()).copied()
}
fn register_segment(counts: &mut HashMap<String, usize>, seg: &MigSegment) {
let tag = seg.id.to_uppercase();
counts
.entry(tag)
.or_insert_with(|| seg.data_elements.len() + seg.composites.len());
}
fn walk_group(counts: &mut HashMap<String, usize>, group: &MigSegmentGroup) {
for seg in &group.segments {
Self::register_segment(counts, seg);
}
for nested in &group.nested_groups {
Self::walk_group(counts, nested);
}
}
}