rbx_rsml/parser/tree_node_group/
mod.rs1use std::{mem, ops::{Index, IndexMut}};
2
3mod tree_node;
4pub use tree_node::{TreeNode, TreeNodeType};
5
6mod root_tree_node;
7pub use root_tree_node::RootTreeNode;
8
9#[derive(Debug)]
10pub struct TreeNodeGroup {
11 pub root: Option<RootTreeNode>,
12 pub nodes: Vec<Option<TreeNode>>
13}
14
15pub enum AnyTreeNode<'a> {
16 Node(Option<&'a TreeNode>),
17 Root(Option<&'a RootTreeNode>)
18}
19
20pub enum AnyTreeNodeMut<'a> {
21 Node(Option<&'a mut TreeNode>),
22 Root(Option<&'a mut RootTreeNode>)
23}
24
25impl TreeNodeGroup {
26 pub fn new() -> Self {
27 Self {
28 root: Some(RootTreeNode::new()),
29 nodes: vec![]
30 }
31 }
32
33 pub fn get(&self, idx: TreeNodeType) -> AnyTreeNode {
34 match idx {
35 TreeNodeType::Node(idx) => AnyTreeNode::Node(self.nodes[idx].as_ref()),
36 TreeNodeType::Root => AnyTreeNode::Root(self.root.as_ref())
37 }
38 }
39
40 pub fn get_root(&self) -> Option<&RootTreeNode> {
41 self.root.as_ref()
42 }
43
44 pub fn get_node_mut(&mut self, idx: TreeNodeType) -> AnyTreeNodeMut {
45 match idx {
46 TreeNodeType::Node(idx) => AnyTreeNodeMut::Node(self.nodes[idx].as_mut()),
47 TreeNodeType::Root => AnyTreeNodeMut::Root(self.root.as_mut())
48 }
49 }
50
51 pub fn get_root_mut(&mut self) -> Option<&mut RootTreeNode> {
52 self.root.as_mut()
53 }
54
55 pub fn add_node(&mut self, tree_node: TreeNode) {
56 self.nodes.push(Some(tree_node));
57 }
58
59 pub fn take_node(&mut self, idx: usize) -> Option<TreeNode> {
60 mem::replace(&mut self.nodes[idx], None)
61 }
62
63 pub fn take_root(&mut self) -> RootTreeNode {
64 mem::replace(&mut self.root, None).unwrap()
65 }
66}
67
68impl Index<usize> for TreeNodeGroup {
69 type Output = Option<TreeNode>;
70
71 fn index(&self, index: usize) -> &Self::Output {
72 &self.nodes[index]
73 }
74}
75
76impl IndexMut<usize> for TreeNodeGroup {
77 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
78 &mut self.nodes[index]
79 }
80}