local_fmt_macros_internal/utils/
hierarchy.rs

1pub struct Hierarchy<I> {
2    items: Vec<I>,
3}
4
5impl<I> Default for Hierarchy<I> {
6    fn default() -> Self {
7        Self::new()
8    }
9}
10
11impl<I> Hierarchy<I> {
12    pub fn new() -> Self {
13        Hierarchy { items: Vec::new() }
14    }
15
16    pub fn process<T>(&mut self, item: I, func: impl FnOnce(&mut Self) -> T) -> T {
17        self.items.push(item);
18        let t = func(self);
19        self.items.pop();
20        t
21    }
22
23    pub fn as_vec(&self) -> &Vec<I> {
24        &self.items
25    }
26}
27
28impl<I: AsRef<str>> Hierarchy<I> {
29    pub fn join(&self, current: &str) -> String {
30        let mut items = self.items.iter().map(|i| i.as_ref()).collect::<Vec<_>>();
31        items.push(current);
32        items.join(".")
33    }
34}
35
36impl<I: ToString> Hierarchy<I> {
37    pub fn joining(&self, current: String) -> String {
38        let mut items = self.items.iter().map(|i| i.to_string()).collect::<Vec<_>>();
39        items.push(current);
40        items.join(".")
41    }
42}