Skip to main content

libutils_report/
state.rs

1//^
2//^ STATE
3//^
4
5//> STATE -> BASE
6pub trait State {
7    fn chain(&self) -> Vec<&'static str>;
8    fn link<'valid>(&'valid mut self) -> &'valid mut Vec<&'static str>;
9}
10
11//> STATE -> DERIVED
12pub trait DerivedState<'valid>: State + From<&'valid mut dyn State> {}
13
14
15//^
16//^ MAIN
17//^
18
19//> MAIN -> STRUCT
20pub struct Main {
21    pub chain: Vec<&'static str> = Vec::new()
22}
23
24//> MAIN -> STATE
25impl State for Main {
26    fn chain(&self) -> Vec<&'static str> {return self.chain.clone()}
27    fn link<'valid>(&'valid mut self) -> &'valid mut Vec<&'static str> {return &mut self.chain}
28}
29
30
31//^
32//^ SAME
33//^
34
35//> SAME -> STRUCT
36pub struct Same<'this> {
37    link: &'this mut Vec<&'static str>
38} 
39
40//> SAME -> STATE
41impl<'this> State for Same<'this> {
42    fn chain(&self) -> Vec<&'static str> {return self.link.clone()}
43    fn link<'valid>(&'valid mut self) -> &'valid mut Vec<&'static str> {return self.link}
44}
45
46//> SAME -> DERIVED STATE
47impl<'valid> DerivedState<'valid> for Same<'valid> {}
48
49//> SAME -> FROM
50impl<'valid> From<&'valid mut (dyn State + 'valid)> for Same<'valid> {
51    fn from(value: &'valid mut (dyn State + 'valid)) -> Self {return Self {
52        link: value.link()
53    }}
54}
55
56
57//^
58//^ NAME
59//^
60
61//> NAME -> STRUCT
62pub struct Name<'valid, const NAME: &'static str> {
63    link: &'valid mut Vec<&'static str>
64} 
65
66//> NAME -> STATE
67impl<'this, const NAME: &'static str> State for Name<'this, NAME> {
68    fn chain(&self) -> Vec<&'static str> {return self.link.clone()}
69    fn link<'valid>(&'valid mut self) -> &'valid mut Vec<&'static str> {return self.link}
70} 
71
72//> NAME -> DROP
73impl<'valid, const NAME: &'static str> Drop for Name<'valid, NAME> {
74    fn drop(&mut self) {self.link.pop();}
75}
76
77//> NAME -> DERIVED STATE
78impl<'valid, const NAME: &'static str> DerivedState<'valid> for Name<'valid, NAME> {}
79
80//> NAME -> FROM
81impl<'valid, const NAME: &'static str> From<&'valid mut (dyn State + 'valid)> for Name<'valid, NAME> {
82    fn from(value: &'valid mut (dyn State + 'valid)) -> Self {
83        value.link().push(NAME);
84        return Self {
85            link: value.link()
86        }
87    }
88}