capability_skeleton/
build_skeleton_level_map.rs

1// ---------------- [ File: capability-skeleton/src/build_skeleton_level_map.rs ]
2crate::ix!();
3
4// -----------------------------------------------------------------------------
5// Helper to build a node->level map using BFS
6// -----------------------------------------------------------------------------
7#[instrument(level = "trace", skip(skel))]
8pub fn build_skeleton_level_map(skel: &Skeleton) -> HashMap<u16, u8> {
9    trace!("Building node->level map with BFS for Skeleton.");
10
11    let mut level_map = HashMap::<u16, u8>::new();
12    let mut visited   = HashSet::new();
13    let mut queue     = VecDeque::new();
14
15    if let Some(root_id) = skel.root_id() {
16        queue.push_back((*root_id, 0u8));
17    } else {
18        debug!("No root => empty level map.");
19        return level_map;
20    }
21
22    while let Some((nid, lvl)) = queue.pop_front() {
23        if !visited.insert(nid) {
24            trace!("Already visited node_id={} => skipping BFS re-processing", nid);
25            continue;
26        }
27        level_map.insert(nid, lvl);
28
29        if let Some(node_ref) = skel.nodes().iter().find(|n| n.id() == nid) {
30            for &child_id in node_ref.child_ids() {
31                queue.push_back((child_id, lvl.saturating_add(1)));
32            }
33        } else {
34            trace!("Node id={} not found in skeleton => ignoring children references.", nid);
35        }
36    }
37
38    trace!("Finished BFS => found {} nodes in level_map.", level_map.len());
39    level_map
40}