1#[macro_export(local_inner_macros)]
45macro_rules! json {
46 (@array [$($elems:expr,)*]) => {
55 json_vec![$($elems,)*]
56 };
57
58 (@array [$($elems:expr),*]) => {
60 json_vec![$($elems),*]
61 };
62
63 (@array [$($elems:expr,)*] null $($rest:tt)*) => {
65 json!(@array [$($elems,)* json!(null)] $($rest)*)
66 };
67
68 (@array [$($elems:expr,)*] true $($rest:tt)*) => {
70 json!(@array [$($elems,)* json!(true)] $($rest)*)
71 };
72
73 (@array [$($elems:expr,)*] false $($rest:tt)*) => {
75 json!(@array [$($elems,)* json!(false)] $($rest)*)
76 };
77
78 (@array [$($elems:expr,)*] $lit:literal $($rest:tt)*) => {
80 json!(@array [$($elems,)* json!($lit)] $($rest)*)
81 };
82
83 (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => {
85 json!(@array [$($elems,)* json!([$($array)*])] $($rest)*)
86 };
87
88 (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => {
90 json!(@array [$($elems,)* json!({$($map)*})] $($rest)*)
91 };
92
93 (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => {
95 json!(@array [$($elems,)* json!($next),] $($rest)*)
96 };
97
98 (@array [$($elems:expr,)*] $last:expr) => {
100 json!(@array [$($elems,)* json!($last)])
101 };
102
103 (@array [$($elems:expr),*] , $($rest:tt)*) => {
105 json!(@array [$($elems,)*] $($rest)*)
106 };
107
108 (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => {
110 json_unexpected!($unexpected)
111 };
112
113 (@object [$($elems:expr,)*] () () ()) => {
124 $crate::Object::from_vec(json_vec![$($elems,)*])
125 };
126
127 (@object [$($elems:expr),*] () () ()) => {
129 $crate::Object::from_vec(json_vec![$($elems),*])
130 };
131
132 (@key ($key:literal)) => {
134 $key.into()
135 };
136
137 (@key ($key:expr)) => {
139 $key.into()
140 };
141
142 (@object [$($elems:expr,)*] ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => {
144 json!(@object [$($elems,)* $crate::object::Entry::new(json!(@key ($($key)+)), json!(null))] () ($($rest)*) ($($rest)*))
145 };
146
147 (@object [$($elems:expr,)*] ($($key:tt)+) (: true $($rest:tt)*) $copy:tt) => {
149 json!(@object [$($elems,)* $crate::object::Entry::new(json!(@key ($($key)+)), json!(true))] () ($($rest)*) ($($rest)*))
150 };
151
152 (@object [$($elems:expr,)*] ($($key:tt)+) (: false $($rest:tt)*) $copy:tt) => {
154 json!(@object [$($elems,)* $crate::object::Entry::new(json!(@key ($($key)+)), json!(false))] () ($($rest)*) ($($rest)*))
155 };
156
157 (@object [$($elems:expr,)*] ($($key:tt)+) (: $lit:literal $($rest:tt)*) $copy:tt) => {
159 json!(@object [$($elems,)* $crate::object::Entry::new(json!(@key ($($key)+)), json!($lit))] () ($($rest)*) ($($rest)*))
160 };
161
162 (@object [$($elems:expr,)*] ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => {
164 json!(@object [$($elems,)* $crate::object::Entry::new(json!(@key ($($key)+)), json!([$($array)*]))] () ($($rest)*) ($($rest)*))
165 };
166
167 (@object [$($elems:expr,)*] ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => {
169 json!(@object [$($elems,)* $crate::object::Entry::new(json!(@key ($($key)+)), json!({$($map)*}))] () ($($rest)*) ($($rest)*))
170 };
171
172 (@object [$($elems:expr,)*] ($($key:tt)+) (: $next:expr, $($rest:tt)*) $copy:tt) => {
174 json!(@object [$($elems,)* $crate::object::Entry::new(json!(@key ($($key)+)), json!($next)),] () ($($rest)*) ($($rest)*))
175 };
176
177 (@object [$($elems:expr,)*] ($($key:tt)+) (: $last:expr) $copy:tt) => {
179 json!(@object [$($elems,)* $crate::object::Entry::new(json!(@key ($($key)+)), json!($last))] () () ())
180 };
181
182 (@object [$($elems:expr),*] () (, $($rest:tt)*) $copy:tt) => {
184 json!(@object [$($elems,)*] () ($($rest)*) ($($rest)*))
185 };
186
187 (@object [$($elems:expr,)*] ($($key:tt)+) (:) $copy:tt) => {
189 json!()
191 };
192
193 (@object [$($elems:expr,)*] ($($key:tt)+) () $copy:tt) => {
196 json!()
198 };
199
200 (@object [$($elems:expr,)*] () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => {
202 json_unexpected!($colon)
204 };
205
206 (@object [$($elems:expr,)*] ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => {
208 json_unexpected!($comma)
210 };
211
212 (@object [$($elems:expr,)*] () (($key:expr) : $($rest:tt)*) $copy:tt) => {
215 json!(@object [$($elems,)*] ($key) (: $($rest)*) (: $($rest)*))
216 };
217
218 (@object [$($elems:expr,)*] ($($key:tt)*) (: $($unexpected:tt)+) $copy:tt) => {
220 json_expect_expr_comma!($($unexpected)+)
221 };
222
223 (@object [$($elems:expr,)*] ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
225 json!(@object [$($elems,)*] ($($key)* $tt) ($($rest)*) ($($rest)*))
226 };
227
228 (null) => {
235 $crate::Value::Null
236 };
237
238 (true) => {
239 $crate::Value::Boolean(true)
240 };
241
242 (false) => {
243 $crate::Value::Boolean(false)
244 };
245
246 ($lit:literal) => {
247 $crate::Value::try_from($lit).unwrap()
248 };
249
250 ([]) => {
251 $crate::Value::Array(json_vec![])
252 };
253
254 ([ $($tt:tt)+ ]) => {
255 $crate::Value::Array(json!(@array [] $($tt)+))
256 };
257
258 ({}) => {
259 $crate::Value::Object($crate::Object::new())
260 };
261
262 ({ $($tt:tt)+ }) => {
263 $crate::Value::Object(json!(@object [] () ($($tt)+) ($($tt)+)))
264 };
265
266 ($other:expr) => {
267 $crate::Value::from($other)
268 };
269}
270
271#[macro_export]
275#[doc(hidden)]
276macro_rules! json_vec {
277 ($($content:tt)*) => {
278 vec![$($content)*]
279 };
280}
281
282#[macro_export]
283#[doc(hidden)]
284macro_rules! json_unexpected {
285 () => {};
286}
287
288#[macro_export]
289#[doc(hidden)]
290macro_rules! json_expect_expr_comma {
291 ($e:expr , $($tt:tt)*) => {};
292}