rbx_rsml/parser/tree_node_group/
mod.rs

1use 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    root: Option<RootTreeNode>,
12    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 nodes_len(&self) -> usize {
41        self.nodes.len()
42    }
43
44    pub fn get_root(&self) -> Option<&RootTreeNode> {
45        self.root.as_ref()
46    }
47
48    pub fn get_node_mut(&mut self, idx: TreeNodeType) -> AnyTreeNodeMut {
49        match idx {
50            TreeNodeType::Node(idx) => AnyTreeNodeMut::Node(self.nodes[idx].as_mut()),
51            TreeNodeType::Root => AnyTreeNodeMut::Root(self.root.as_mut())
52        }
53    }
54
55    pub fn get_root_mut(&mut self) -> Option<&mut RootTreeNode> {
56        self.root.as_mut()
57    }
58
59    pub fn add_node(&mut self, tree_node: TreeNode) {
60        self.nodes.push(Some(tree_node));
61    }
62
63    pub fn take_node(&mut self, idx: usize) -> Option<TreeNode> {
64        mem::replace(&mut self.nodes[idx], None)
65    }
66
67    pub fn take_root(&mut self) -> Option<RootTreeNode> {
68        mem::replace(&mut self.root, None)
69    }
70}
71
72impl Index<usize> for TreeNodeGroup {
73    type Output = Option<TreeNode>;
74
75    fn index(&self, index: usize) -> &Self::Output {
76        &self.nodes[index]
77    }
78}
79
80impl IndexMut<usize> for TreeNodeGroup {
81    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
82        &mut self.nodes[index]
83    }
84}