1pub trait State {
7 fn chain(&self) -> Vec<&'static str>;
8 fn link<'valid>(&'valid mut self) -> &'valid mut Vec<&'static str>;
9}
10
11pub trait DerivedState<'valid>: State + From<&'valid mut dyn State> {}
13
14
15pub struct Main {
21 pub chain: Vec<&'static str> = Vec::new()
22}
23
24impl 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
31pub struct Same<'this> {
37 link: &'this mut Vec<&'static str>
38}
39
40impl<'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
46impl<'valid> DerivedState<'valid> for Same<'valid> {}
48
49impl<'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
57pub struct Name<'valid, const NAME: &'static str> {
63 link: &'valid mut Vec<&'static str>
64}
65
66impl<'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
72impl<'valid, const NAME: &'static str> Drop for Name<'valid, NAME> {
74 fn drop(&mut self) {self.link.pop();}
75}
76
77impl<'valid, const NAME: &'static str> DerivedState<'valid> for Name<'valid, NAME> {}
79
80impl<'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}