teo_runtime/value/
macros.rs1#[macro_export]
20macro_rules! teon {
21 (@array [$($elems:expr,)*]) => {
30 $crate::teon_vec![$($elems,)*]
31 };
32
33 (@array [$($elems:expr),*]) => {
35 $crate::teon_vec![$($elems),*]
36 };
37
38 (@array [$($elems:expr,)*] null $($rest:tt)*) => {
40 teon!(@array [$($elems,)* teon!(null)] $($rest)*)
41 };
42
43 (@array [$($elems:expr,)*] true $($rest:tt)*) => {
45 teon!(@array [$($elems,)* teon!(true)] $($rest)*)
46 };
47
48 (@array [$($elems:expr,)*] false $($rest:tt)*) => {
50 teon!(@array [$($elems,)* teon!(false)] $($rest)*)
51 };
52
53 (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => {
55 teon!(@array [$($elems,)* teon!([$($array)*])] $($rest)*)
56 };
57
58 (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => {
60 teon!(@array [$($elems,)* teon!({$($map)*})] $($rest)*)
61 };
62
63 (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => {
65 teon!(@array [$($elems,)* teon!($next),] $($rest)*)
66 };
67
68 (@array [$($elems:expr,)*] $last:expr) => {
70 teon!(@array [$($elems,)* teon!($last)])
71 };
72
73 (@array [$($elems:expr),*] , $($rest:tt)*) => {
75 teon!(@array [$($elems,)*] $($rest)*)
76 };
77
78 (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => {
80 teo_runtime::teon_unexpected!($unexpected)
81 };
82
83 (@object $object:ident () () ()) => {};
95
96 (@object $object:ident [$($key:tt)+] ($value:expr) , $($rest:tt)*) => {
98 let _ = $object.insert(($($key)+).into(), $value);
99 teon!(@object $object () ($($rest)*) ($($rest)*));
100 };
101
102 (@object $object:ident [$($key:tt)+] ($value:expr) $unexpected:tt $($rest:tt)*) => {
104 teo_runtime::teon_unexpected!($unexpected);
105 };
106
107 (@object $object:ident [$($key:tt)+] ($value:expr)) => {
109 let _ = $object.insert(($($key)+).into(), $value);
110 };
111
112 (@object $object:ident ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => {
114 teon!(@object $object [$($key)+] (teon!(null)) $($rest)*);
115 };
116
117 (@object $object:ident ($($key:tt)+) (: true $($rest:tt)*) $copy:tt) => {
119 teon!(@object $object [$($key)+] (teon!(true)) $($rest)*);
120 };
121
122 (@object $object:ident ($($key:tt)+) (: false $($rest:tt)*) $copy:tt) => {
124 teon!(@object $object [$($key)+] (teon!(false)) $($rest)*);
125 };
126
127 (@object $object:ident ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => {
129 teon!(@object $object [$($key)+] (teon!([$($array)*])) $($rest)*);
130 };
131
132 (@object $object:ident ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => {
134 teon!(@object $object [$($key)+] (teon!({$($map)*})) $($rest)*);
135 };
136
137 (@object $object:ident ($($key:tt)+) (: $value:expr , $($rest:tt)*) $copy:tt) => {
139 teon!(@object $object [$($key)+] (teon!($value)) , $($rest)*);
140 };
141
142 (@object $object:ident ($($key:tt)+) (: $value:expr) $copy:tt) => {
144 teon!(@object $object [$($key)+] (teon!($value)));
145 };
146
147 (@object $object:ident ($($key:tt)+) (:) $copy:tt) => {
149 teon!();
151 };
152
153 (@object $object:ident ($($key:tt)+) () $copy:tt) => {
156 teon!();
158 };
159
160 (@object $object:ident () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => {
162 teo_runtime::teon_unexpected!($colon);
164 };
165
166 (@object $object:ident ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => {
168 teo_runtime::teon_unexpected!($comma);
170 };
171
172 (@object $object:ident () (($key:expr) : $($rest:tt)*) $copy:tt) => {
175 teon!(@object $object ($key) (: $($rest)*) (: $($rest)*));
176 };
177
178 (@object $object:ident ($($key:tt)*) (: $($unexpected:tt)+) $copy:tt) => {
180 teo_runtime::teon_expect_expr_comma!($($unexpected)+);
181 };
182
183 (@object $object:ident ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
185 teon!(@object $object ($($key)* $tt) ($($rest)*) ($($rest)*));
186 };
187
188 (null) => {
195 $crate::value::Value::Null
196 };
197
198 ([]) => {
199 $crate::value::Value::Array(vec![])
200 };
201
202 ([ $($tt:tt)+ ]) => {
203 $crate::value::Value::Array($crate::teon!(@array [] $($tt)+))
204 };
205
206 ({}) => {
207 $crate::value::Value::Dictionary(indexmap::IndexMap::new())
208 };
209
210 ({ $($tt:tt)+ }) => {
211 $crate::value::Value::Dictionary({
212 let mut map = indexmap::IndexMap::new();
213 teon!(@object map () ($($tt)+) ($($tt)+));
214 map
215 })
216 };
217
218 ($other:expr) => {
221 $crate::value::Value::from($other)
222 };
223}
224
225#[macro_export]
229#[doc(hidden)]
230macro_rules! teon_vec {
231 ($($content:tt)*) => {
232 vec![$($content)*]
233 };
234}
235
236#[macro_export]
237#[doc(hidden)]
238macro_rules! teon_unexpected {
239 () => {};
240}
241
242#[macro_export]
243#[doc(hidden)]
244macro_rules! teon_expect_expr_comma {
245 ($e:expr , $($tt:tt)*) => {};
246}