1#[macro_export(local_inner_macros)]
52macro_rules! value {
53 ($($json:tt)+) => {
55 value_internal!($($json)+)
56 };
57}
58
59#[macro_export(local_inner_macros)]
62#[doc(hidden)]
63macro_rules! value_internal {
64 (@array [$($elems:expr,)*]) => {
73 value_internal_vec![$($elems,)*]
74 };
75
76 (@array [$($elems:expr),*]) => {
78 value_internal_vec![$($elems),*]
79 };
80
81 (@array [$($elems:expr,)*] null $($rest:tt)*) => {
83 value_internal!(@array [$($elems,)* value_internal!(null)] $($rest)*)
84 };
85
86 (@array [$($elems:expr,)*] true $($rest:tt)*) => {
88 value_internal!(@array [$($elems,)* value_internal!(true)] $($rest)*)
89 };
90
91 (@array [$($elems:expr,)*] false $($rest:tt)*) => {
93 value_internal!(@array [$($elems,)* value_internal!(false)] $($rest)*)
94 };
95
96 (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => {
98 value_internal!(@array [$($elems,)* value_internal!([$($array)*])] $($rest)*)
99 };
100
101 (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => {
103 value_internal!(@array [$($elems,)* value_internal!({$($map)*})] $($rest)*)
104 };
105
106 (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => {
108 value_internal!(@array [$($elems,)* value_internal!($next),] $($rest)*)
109 };
110
111 (@array [$($elems:expr,)*] $last:expr) => {
113 value_internal!(@array [$($elems,)* value_internal!($last)])
114 };
115
116 (@array [$($elems:expr),*] , $($rest:tt)*) => {
118 value_internal!(@array [$($elems,)*] $($rest)*)
119 };
120
121 (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => {
123 value_unexpected!($unexpected)
124 };
125
126 (@object $object:ident () () ()) => {};
138
139 (@object $object:ident [$($key:tt)+] ($value:expr) , $($rest:tt)*) => {
141 let _ = $object.insert($crate::key_str($($key)+), $value);
142 value_internal!(@object $object () ($($rest)*) ($($rest)*));
143 };
144
145 (@object $object:ident [$($key:tt)+] ($value:expr) $unexpected:tt $($rest:tt)*) => {
147 value_unexpected!($unexpected);
148 };
149
150 (@object $object:ident [$($key:tt)+] ($value:expr)) => {
152 $object.insert($crate::key_str($($key)+), $value);
153 };
154
155 (@object $object:ident ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => {
157 value_internal!(@object $object [$($key)+] (value_internal!(null)) $($rest)*);
158 };
159
160 (@object $object:ident ($($key:tt)+) (: true $($rest:tt)*) $copy:tt) => {
162 value_internal!(@object $object [$($key)+] (value_internal!(true)) $($rest)*);
163 };
164
165 (@object $object:ident ($($key:tt)+) (: false $($rest:tt)*) $copy:tt) => {
167 value_internal!(@object $object [$($key)+] (value_internal!(false)) $($rest)*);
168 };
169
170 (@object $object:ident ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => {
172 value_internal!(@object $object [$($key)+] (value_internal!([$($array)*])) $($rest)*);
173 };
174
175 (@object $object:ident ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => {
177 value_internal!(@object $object [$($key)+] (value_internal!({$($map)*})) $($rest)*);
178 };
179
180 (@object $object:ident ($($key:tt)+) (: $value:expr , $($rest:tt)*) $copy:tt) => {
182 value_internal!(@object $object [$($key)+] (value_internal!($value)) , $($rest)*);
183 };
184
185 (@object $object:ident ($($key:tt)+) (: $value:expr) $copy:tt) => {
187 value_internal!(@object $object [$($key)+] (value_internal!($value)));
188 };
189
190 (@object $object:ident ($($key:tt)+) (:) $copy:tt) => {
192 value_internal!();
194 };
195
196 (@object $object:ident ($($key:tt)+) () $copy:tt) => {
199 value_internal!();
201 };
202
203 (@object $object:ident () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => {
205 value_unexpected!($colon);
207 };
208
209 (@object $object:ident ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => {
211 value_unexpected!($comma);
213 };
214
215 (@object $object:ident () (($key:expr) : $($rest:tt)*) $copy:tt) => {
218 value_internal!(@object $object ($key) (: $($rest)*) (: $($rest)*));
219 };
220
221 (@object $object:ident ($($key:tt)*) (: $($unexpected:tt)+) $copy:tt) => {
223 value_expect_expr_comma!($($unexpected)+);
224 };
225
226 (@object $object:ident ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
228 value_internal!(@object $object ($($key)* $tt) ($($rest)*) ($($rest)*));
229 };
230
231 (null) => {
238 $crate::DecodedValue::Null
239 };
240
241 (true) => {
242 $crate::DecodedValue::Bool(true)
243 };
244
245 (false) => {
246 $crate::DecodedValue::Bool(false)
247 };
248
249 ([]) => {
250 $crate::DecodedValue::Array(value_internal_vec![])
251 };
252
253 ([ $($tt:tt)+ ]) => {
254 $crate::DecodedValue::Array(value_internal!(@array [] $($tt)+))
255 };
256
257 ({}) => {
258 $crate::DecodedValue::Object($crate::DecodedObject::new())
259 };
260
261 ({ $($tt:tt)+ }) => {
262 $crate::DecodedValue::Object({
263 let mut object = $crate::DecodedObject::new();
264 value_internal!(@object object () ($($tt)+) ($($tt)+));
265 object
266 })
267 };
268
269 ($other:expr) => {
275 <_ as ::core::convert::Into<$crate::DecodedValue<'_>>>::into((&$other))
277 };
278}
279
280#[macro_export]
284#[doc(hidden)]
285macro_rules! value_internal_vec {
286 ($($content:tt)*) => {
287 vec![$($content)*]
288 };
289}
290
291#[macro_export]
292#[doc(hidden)]
293macro_rules! value_unexpected {
294 () => {};
295}
296
297#[macro_export]
298#[doc(hidden)]
299macro_rules! value_expect_expr_comma {
300 ($e:expr , $($tt:tt)*) => {};
301}
302
303#[macro_export]
304macro_rules! clear {
305 ( $name:ident in $x:expr ) => {
306 #[allow(unused_mut)]
307 let mut $name = &mut ($x); #[allow(unused_mut)]
309 let mut $name = $name._clear(); };
314 ( $name:ident ) => {
315 #[allow(unused_mut)]
316 let mut $name = &mut $name;
317 #[allow(unused_mut)]
318 let mut $name = $name._clear();
319 };
320}
321
322#[macro_export]
323macro_rules! rewind {
324 ( $name:ident in $x:expr ) => {
325 #[allow(unused_mut)]
326 let mut $name = &mut ($x); #[allow(unused_mut)]
328 let mut $name = $name._rewind();
329 };
330 ( $name:ident ) => {
331 #[allow(unused_mut)]
332 let mut $name = &mut $name;
333 #[allow(unused_mut)]
334 let mut $name = $name._rewind();
335 }
336}
337
338#[macro_export]
339macro_rules! pool {
340 ( $name:ident ) => {
341 let mut $name = $crate::memorypool::MemoryPool::new();
342 $crate::clear!($name);
343 }
344}