1#[macro_export(local_inner_macros)]
54macro_rules! json {
55 ($($json:tt)+) => {
57 json_internal!($($json)+)
58 };
59}
60
61#[macro_export(local_inner_macros)]
62#[doc(hidden)]
63macro_rules! json_internal {
64 (@array [$($elems:expr,)*]) => {
73 json_internal_vec![$($elems,)*]
74 };
75
76 (@array [$($elems:expr),*]) => {
78 json_internal_vec![$($elems),*]
79 };
80
81 (@array [$($elems:expr,)*] null $($rest:tt)*) => {
83 json_internal!(@array [$($elems,)* json_internal!(null)] $($rest)*)
84 };
85
86 (@array [$($elems:expr,)*] true $($rest:tt)*) => {
88 json_internal!(@array [$($elems,)* json_internal!(true)] $($rest)*)
89 };
90
91 (@array [$($elems:expr,)*] false $($rest:tt)*) => {
93 json_internal!(@array [$($elems,)* json_internal!(false)] $($rest)*)
94 };
95
96 (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => {
98 json_internal!(@array [$($elems,)* json_internal!([$($array)*])] $($rest)*)
99 };
100
101 (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => {
103 json_internal!(@array [$($elems,)* json_internal!({$($map)*})] $($rest)*)
104 };
105
106 (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => {
108 json_internal!(@array [$($elems,)* json_internal!($next),] $($rest)*)
109 };
110
111 (@array [$($elems:expr,)*] $last:expr) => {
113 json_internal!(@array [$($elems,)* json_internal!($last)])
114 };
115
116 (@array [$($elems:expr),*] , $($rest:tt)*) => {
118 json_internal!(@array [$($elems,)*] $($rest)*)
119 };
120
121 (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => {
123 json_unexpected!($unexpected)
124 };
125
126 (@object [$($elems:expr),*] () () ()) => { json_internal_vec![$($elems),*] };
138
139 (@object [$($elems:expr),*] [$($key:tt)+] ($value:expr) $(,)?) => {
140 json_internal_vec![$($elems,)* $crate::__private::KV::Pair(json_internal!($($key)*), $value)]
141 };
142
143 (@object [$($elems:expr),*] [$($key:tt)+] ($value:expr) , $($rest:tt)*) => {
145 json_internal!(@object [$($elems,)* $crate::__private::KV::Pair(json_internal!($($key)*), $value)] () ($($rest)*) ($($rest)*))
146 };
147
148 (@object [$($elems:expr),*] [$($key:tt)+] ($value:expr) $unexpected:tt $($rest:tt)*) => {
150 json_unexpected!($unexpected)
151 };
152
153 (@object [$($elems:expr),*] ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => {
155 json_internal!(@object [$($elems),*] [$($key)+] (json_internal!(null)) $($rest)*)
156 };
157
158 (@object [$($elems:expr),*] ($($key:tt)+) (: true $($rest:tt)*) $copy:tt) => {
160 json_internal!(@object [$($elems),*] [$($key)+] (json_internal!(true)) $($rest)*)
161 };
162
163 (@object [$($elems:expr),*] ($($key:tt)+) (: false $($rest:tt)*) $copy:tt) => {
165 json_internal!(@object [$($elems),*] [$($key)+] (json_internal!(false)) $($rest)*)
166 };
167
168 (@object [$($elems:expr),*] ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => {
170 json_internal!(@object [$($elems),*] [$($key)+] (json_internal!([$($array)*])) $($rest)*)
171 };
172
173 (@object [$($elems:expr),*] ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => {
175 json_internal!(@object [$($elems),*] [$($key)+] (json_internal!({$($map)*})) $($rest)*)
176 };
177
178 (@object [$($elems:expr),*] ($($key:tt)+) (: $value:expr , $($rest:tt)*) $copy:tt) => {
180 json_internal!(@object [$($elems),*] [$($key)+] (json_internal!($value)) , $($rest)*)
181 };
182
183 (@object [$($elems:expr),*] ($($key:tt)+) (: $value:expr) $copy:tt) => {
185 json_internal!(@object [$($elems),*] [$($key)+] (json_internal!($value)))
186 };
187
188 (@object [$($elems:expr),*] ($($key:tt)+) (:) $copy:tt) => {
190 json_internal!()
192 };
193
194 (@object [$($elems:expr),*] ($($key:tt)+) () $copy:tt) => {
197 json_internal!()
199 };
200
201 (@object [$($elems:expr),*] () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => {
203 json_unexpected!($colon)
205 };
206
207 (@object [$($elems:expr),*] ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => {
209 json_unexpected!($comma)
211 };
212
213 (@object [$($elems:expr),*] () (($key:expr) : $($rest:tt)*) $copy:tt) => {
216 json_internal!(@object [$($elems),*] ($key) (: $($rest)*) (: $($rest)*))
217 };
218
219 (@object [$($elems:expr),*] ($($key:tt)*) (: $($unexpected:tt)+) $copy:tt) => {
221 json_expect_expr_comma!($($unexpected)+)
222 };
223
224 (@object [$($elems:expr),*] ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
226 json_internal!(@object [$($elems),*] ($($key)* $tt) ($($rest)*) ($($rest)*))
227 };
228
229 (null) => {
236 $crate::__private::Null
237 };
238
239 (true) => {
240 $crate::__private::Expr(true)
241 };
242
243 (false) => {
244 $crate::__private::Expr(false)
245 };
246
247 ([]) => {
248 $crate::__private::Array(())
249 };
250
251 ([ $($tt:tt)+ ]) => {
252 $crate::__private::Array(json_internal!(@array [] $($tt)+))
253 };
254
255 ({}) => {
256 $crate::__private::Map(())
257 };
258
259 ({ $($tt:tt)+ }) => {
260 $crate::__private::Map(json_internal!(@object [] () ($($tt)+) ($($tt)+)))
261 };
262
263 ($other:expr) => {
266 $crate::__private::Expr($other)
267 };
268}
269
270#[macro_export(local_inner_macros)]
274#[doc(hidden)]
275macro_rules! json_internal_vec {
276 ($($g:expr),* $(,)?) => {
277 $crate::hlist![
278 $(::core::option::Option::Some($g)),*
279 ]
280 };
281}
282
283#[macro_export]
284#[doc(hidden)]
285macro_rules! json_unexpected {
286 () => {};
287}
288
289#[macro_export]
290#[doc(hidden)]
291macro_rules! json_expect_expr_comma {
292 ($e:expr , $($tt:tt)*) => {};
293}
294
295#[macro_export]
296#[doc(hidden)]
297macro_rules! hlist {
298 () => { () };
300 ($g0:expr) => {
302 $g0
303 };
304 ($($g0:expr, $g1:expr),*) => {
306 $crate::hlist!($(
307 ($g0, $g1)
308 ),*)
309 };
310 ($g:expr, $($g0:expr, $g1:expr),*) => {
312 $crate::hlist!(
313 $g,
314 $(
315 ($g0, $g1)
316 ),*
317 )
318 };
319}