capability_skeleton/skeleton_node_set_child_ids.rs
1// ---------------- [ File: capability-skeleton/src/skeleton_node_set_child_ids.rs ]
2crate::ix!();
3
4impl SkeletonNode {
5
6 /// Mutate `child_ids`, turning this node into `Dispatch` if needed.
7 /// If `new_child_ids` is empty, we switch to `LeafHolder` with leaf_count=0.
8 pub fn set_child_ids(&mut self, new_child_ids: Vec<u16>) {
9 if new_child_ids.is_empty() {
10 // become a LeafHolder if no children
11 match self {
12 SkeletonNode::LeafHolder { .. } => {
13 // already a LeafHolder, do nothing or set leaf_count=0
14 }
15 SkeletonNode::Dispatch {
16 id, parent_id, name, original_key, ordering, ..
17 } => {
18 *self = SkeletonNode::LeafHolder {
19 id: *id,
20 parent_id: *parent_id,
21 leaf_count: 0,
22 capstone: false,
23 name: name.clone(),
24 original_key: original_key.clone(),
25 ordering: ordering.clone(),
26 };
27 }
28 SkeletonNode::Aggregate {
29 id, parent_id, name, original_key, ordering, ..
30 } => {
31 *self = SkeletonNode::LeafHolder {
32 id: *id,
33 parent_id: *parent_id,
34 leaf_count: 0,
35 capstone: false,
36 name: name.clone(),
37 original_key: original_key.clone(),
38 ordering: ordering.clone(),
39 };
40 }
41 }
42 } else {
43 // become Dispatch if we have new children
44 match self {
45 SkeletonNode::Dispatch { child_ids, .. } => {
46 *child_ids = new_child_ids;
47 }
48 SkeletonNode::Aggregate {
49 id, parent_id, name, original_key, ordering, ..
50 } => {
51 *self = SkeletonNode::Dispatch {
52 id: *id,
53 parent_id: *parent_id,
54 child_ids: new_child_ids,
55 name: name.clone(),
56 original_key: original_key.clone(),
57 ordering: ordering.clone(),
58 };
59 }
60 SkeletonNode::LeafHolder {
61 id, parent_id, name, original_key, ordering, ..
62 } => {
63 *self = SkeletonNode::Dispatch {
64 id: *id,
65 parent_id: *parent_id,
66 child_ids: new_child_ids,
67 name: name.clone(),
68 original_key: original_key.clone(),
69 ordering: ordering.clone(),
70 };
71 }
72 }
73 }
74 }
75}