local_fmt_macros_internal/utils/
hierarchy.rs1pub 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}