flange_flat_tree/tree/
builder.rs

1use crate::VecTree;
2/**
3
4# Example:
5
6```
7use flange_flat_tree::Builder;
8use flange_flat_tree::Tree;
9use flange_flat_tree::Subtree;
10
11let mut b = Builder::new();
12b.start_element("root");
13b.start_end_element("first_child");
14b.start_element("second_child_with_children");
15b.start_end_element("deep_child");
16b.end_element();
17b.end_element();
18
19let tree = b.build();
20
21assert_eq!(tree.root().value(), &"root");
22assert_eq!(tree.root().children()[0].value(), &"first_child");
23assert_eq!(tree.root().children()[1].children()[0].value(), &"deep_child");
24```
25*/
26pub struct Builder<A> {
27    nav_builder: crate::navigator::Builder,
28    values: Vec<A>,
29}
30
31impl<A> Builder<A> {
32    pub fn new() -> Builder<A> {
33        Builder {
34            nav_builder: crate::navigator::Builder::default(),
35            values: Vec::new(),
36        }
37    }
38
39    pub fn with_capacity(c: usize) -> Builder<A> {
40        Builder {
41            nav_builder: crate::navigator::Builder::with_capacity(c),
42            values: Vec::with_capacity(c),
43        }
44    }
45
46    pub fn get(&self, index: usize) -> Option<&A> {
47        self.values.get(index)
48    }
49
50    pub fn get_mut(&mut self, index: usize) -> Option<&mut A> {
51        self.values.get_mut(index)
52    }
53
54    pub fn start_element(&mut self, el: A) -> usize {
55        self.values.push(el);
56        self.nav_builder.start_element()
57    }
58
59    pub fn end_element(&mut self) -> usize {
60        self.nav_builder.end_element()
61    }
62
63    pub fn start_end_element(&mut self, el: A) -> usize {
64        self.values.push(el);
65        self.nav_builder.start_end_element()
66    }
67}
68
69impl<A> Default for Builder<A> {
70    fn default() -> Self {
71        Self::new()
72    }
73}
74
75impl<A> Builder<A> {
76    pub fn build(self) -> VecTree<A> {
77        VecTree {
78            nav: self.nav_builder.build(),
79            values: self.values,
80        }
81    }
82}