1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use std::fmt::Display;

pub(crate) struct Names<'a>{
    pub(crate) name : &'a str,
    pub(crate) next : Option<&'a Names<'a>>,
}

impl<'a> Names<'a>{
    pub fn to_string(&self) -> String{
        let mut vec : Vec<String> = vec![];
        let mut cur = self;
        loop{
            vec.push(cur.name.to_string());
            if cur.next.is_none(){
                break;
            }
            cur = cur.next.unwrap();
        }
        vec.reverse();
        vec.join(".")
    }

    pub fn append(&'a self, name : &'a str) -> Self{
        Names::<'a>{ name, next : Some(self)}
    }

    pub fn new(name : &'a str) -> Self{
        Names::<'a>{ name, next : None }
    }
}

impl<'a> Display for Names<'a>{
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {

        write!(f, "{}", self.to_string())
    }

}