holium_rs_sdk/internal/
key_tree.rs

1//! Key trees are responsible for recursively holding structure keys used as I/O paramters in transformations
2
3#[derive(Default, Debug, Eq, PartialEq)]
4pub struct Node {
5    pub value: Option<&'static str>,
6    pub children: Vec<Node>,
7}
8
9/// Trait meant to generate key node for supported native rust types
10pub trait GenerateNode {
11    fn generate_node() -> Node;
12}
13
14macro_rules! primitives_impl {
15    ($ty:ident) => {
16        impl GenerateNode for $ty {
17            #[inline]
18            fn generate_node() -> Node {
19                Node::default()
20            }
21        }
22    };
23}
24
25primitives_impl!(bool);
26primitives_impl!(isize);
27primitives_impl!(i8);
28primitives_impl!(i16);
29primitives_impl!(i32);
30primitives_impl!(i64);
31primitives_impl!(i128);
32primitives_impl!(usize);
33primitives_impl!(u8);
34primitives_impl!(u16);
35primitives_impl!(u32);
36primitives_impl!(u64);
37primitives_impl!(u128);
38primitives_impl!(f32);
39primitives_impl!(f64);
40primitives_impl!(char);
41primitives_impl!(str);
42primitives_impl!(String);
43
44impl<T> GenerateNode for [T] {
45    #[inline]
46    fn generate_node() -> Node {
47        Node::default()
48    }
49}
50
51impl<T> GenerateNode for Vec<T> {
52    #[inline]
53    fn generate_node() -> Node {
54        Node::default()
55    }
56}
57
58macro_rules! array_impls {
59    ($($len:tt)+) => {
60        $(
61            impl<T> GenerateNode for [T; $len] {
62                #[inline]
63                fn generate_node() -> Node {
64                    Node::default()
65                }
66            }
67        )+
68    }
69}
70
71array_impls! {
72    0  01 02 03 04 05 06 07 08 09
73    10 11 12 13 14 15 16 17 18 19
74    20 21 22 23 24 25 26 27 28 29
75    30 31 32
76}
77
78impl<T> GenerateNode for Option<T>
79where
80    T: GenerateNode,
81{
82    #[inline]
83    fn generate_node() -> Node {
84        T::generate_node()
85    }
86}
87
88#[cfg(test)]
89mod tests {
90    use super::*;
91
92    macro_rules! declare_primitive_tests {
93        (
94            $readable:tt
95            $($name:ident { $($ty:ident,)+ })+
96        ) => {
97            $(
98                #[test]
99                fn $name() {
100                    $(
101                        assert_eq!(Node { value: None, children: Vec::new() }, $ty::generate_node());
102                    )+
103                }
104            )+
105        };
106
107        ($($name:ident { $($ty:ident,)+ })+) => {
108            $(
109                #[test]
110                fn $name() {
111                    $(
112                        assert_eq!(Node { value: None, children: Vec::new() }, $ty::generate_node());
113                    )+
114                }
115            )+
116        }
117    }
118
119    declare_primitive_tests! {
120        test_primitives {
121            bool,
122            isize,
123            i8,
124            i16,
125            i32,
126            i64,
127            usize,
128            u8,
129            u16,
130            u32,
131            u64,
132            f32,
133            f64,
134            char,
135            i128,
136            u128,
137            str,
138            String,
139        }
140    }
141
142    #[test]
143    fn test_array() {
144        assert_eq!(Node::default(), <[u8; 32]>::generate_node());
145        assert_eq!(Node::default(), <[u8]>::generate_node());
146    }
147
148    #[test]
149    fn test_vec() {
150        assert_eq!(Node::default(), Vec::<u8>::generate_node());
151    }
152
153    #[test]
154    fn test_option() {
155        assert_eq!(Node::default(), Option::<u8>::generate_node());
156    }
157}