capability-skeleton 0.1.0

A Rust library for managing and building complex hierarchical tree structures such as skill trees. Supports serialization, error handling, and deep tree metrics.
Documentation
// ---------------- [ File: capability-skeleton/src/tree_breadth_measurer.rs ]
crate::ix!();

impl TreeBreadthMeasurer for Skeleton {
    #[instrument(level = "trace", skip(self))]
    fn measure_tree_breadth_distribution(&self) -> Vec<u8> {
        let mut distribution = Vec::with_capacity(self.nodes().len());
        for node in self.nodes() {
            let child_count = node.child_ids().len() as u8;
            distribution.push(child_count);
        }
        distribution
    }
}

#[cfg(test)]
mod skeleton_breadth_measurer_assessment {
    use super::*;

    #[traced_test]
    fn check_breadth_distribution_in_empty_skeleton() {
        let skel = SkeletonBuilder::default().build().unwrap();
        let dist = skel.measure_tree_breadth_distribution();
        assert!(dist.is_empty());
    }

    #[traced_test]
    fn check_breadth_distribution_for_mixed_branching() {
        // root->(childA, childB), childA->(childC, childD), childB->()
        let root = SkeletonNodeBuilder::default()
            .id(0u16)
            .child_ids(vec![1u16,2u16])
            .name("root")
            .original_key("root")
            .build(NodeKind::Dispatch)
            .unwrap();
        let child_a = SkeletonNodeBuilder::default()
            .id(1u16)
            .child_ids(vec![3u16,4u16])
            .name("childA")
            .original_key("childA")
            .build(NodeKind::Dispatch)
            .unwrap();
        let child_b = SkeletonNodeBuilder::default()
            .id(2u16)
            .name("childB")
            .original_key("childB")
            .build(NodeKind::LeafHolder)
            .unwrap();
        let child_c = SkeletonNodeBuilder::default()
            .id(3u16)
            .name("childC")
            .original_key("childC")
            .build(NodeKind::LeafHolder)
            .unwrap();
        let child_d = SkeletonNodeBuilder::default()
            .id(4u16)
            .name("childD")
            .original_key("childD")
            .build(NodeKind::LeafHolder)
            .unwrap();

        let skel = SkeletonBuilder::default()
            .nodes(vec![root, child_a, child_b, child_c, child_d])
            .root_id(Some(0u16))
            .build()
            .unwrap();

        let dist = skel.measure_tree_breadth_distribution();
        assert_eq!(dist, vec![2,2,0,0,0]);
    }
}