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