holium_rs_sdk/internal/
key_tree.rs1#[derive(Default, Debug, Eq, PartialEq)]
4pub struct Node {
5 pub value: Option<&'static str>,
6 pub children: Vec<Node>,
7}
8
9pub 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}