aimx/aim/
tree_writer.rs

1use crate::aim::Writer;
2
3pub struct TreeWriter {
4    level_length: [u16; 4],
5    is_complete: u8,
6}
7
8// Automate printing simple tree structures
9impl TreeWriter {
10
11    pub fn new() -> Self {
12        Self {
13            level_length: [
14                0,
15                0,
16                0,
17                0
18            ],
19            is_complete: 0,   
20        }
21    }
22
23    pub fn one(&mut self, one: usize) {
24        self.level_length[0] = one as u16;
25        self.level_length[1] = 0;
26        self.level_length[2] = 0;
27        self.level_length[3] = 0;
28        self.is_complete = 0;   
29    }
30
31    pub fn two(&mut self, one: usize, two: usize) {
32        self.level_length[0] = one as u16;
33        self.level_length[1] = two as u16;
34        self.level_length[2] = 0;
35        self.level_length[3] = 0;
36        self.is_complete = 0;   
37    }
38
39    pub fn three(&mut self, one: usize, two: usize, three: usize) {
40        self.level_length[0] = one as u16;
41        self.level_length[1] = two as u16;
42        self.level_length[2] = three as u16;
43        self.level_length[3] = 0;
44        self.is_complete = 0;   
45    }
46
47    pub fn four(&mut self, one: usize, two: usize, three: usize, four: usize) {
48        self.level_length[0] = one as u16;
49        self.level_length[1] = two as u16;
50        self.level_length[2] = three as u16;
51        self.level_length[3] = four as u16;
52        self.is_complete = 0;   
53    }
54
55    pub fn print(&mut self, index: usize, level: usize, writer: &mut Writer) {
56        const RUNNING:  &'static str = "│ ";
57        const COMPLETE: &'static str = "  ";
58        const NEXT:     &'static str = "├─";
59        const LAST:     &'static str = "└─";
60        assert!(level < 4);
61        for l in 0..level {
62            if 0 == (self.is_complete & 1 << l) {
63                writer.write_str(RUNNING);
64            } else {
65                writer.write_str(COMPLETE);
66            }
67        }
68        if index + 1 == self.level_length[level] as usize {
69            writer.write_str(LAST);
70            self.is_complete |= 1 << level
71        } else {
72            writer.write_str(NEXT);
73        }
74    }
75
76    pub fn to_sting(&mut self, index: usize, level: usize) -> String {
77        let mut writer = Writer::stringizer();
78        self.print(index, level, &mut writer);
79        writer.finish()
80    }
81}