capability_skeleton/
build_skeleton_level_map.rs1crate::ix!();
3
4#[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}