1#[macro_export]
25macro_rules! value {
26 ($($value:tt)+) => {
27 $crate::__value_internal!($($value)+)
28 };
29}
30
31#[macro_export]
33#[doc(hidden)]
34macro_rules! __value_internal {
35 (@seq [$($elems:expr,)*]) => {
40 ::std::vec![$($elems,)*]
41 };
42
43 (@seq [$($elems:expr),*]) => {
45 ::std::vec![$($elems),*]
46 };
47
48 (@seq [$($elems:expr,)*] null $($rest:tt)*) => {
50 $crate::__value_internal!(@seq [$($elems,)* $crate::__value_internal!(null)] $($rest)*)
51 };
52
53 (@seq [$($elems:expr,)*] true $($rest:tt)*) => {
55 $crate::__value_internal!(@seq [$($elems,)* $crate::__value_internal!(true)] $($rest)*)
56 };
57
58 (@seq [$($elems:expr,)*] false $($rest:tt)*) => {
60 $crate::__value_internal!(@seq [$($elems,)* $crate::__value_internal!(false)] $($rest)*)
61 };
62
63 (@seq [$($elems:expr,)*] [$($seq:tt)*] $($rest:tt)*) => {
65 $crate::__value_internal!(@seq [$($elems,)* $crate::__value_internal!([$($seq)*])] $($rest)*)
66 };
67
68 (@seq [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => {
70 $crate::__value_internal!(@seq [$($elems,)* $crate::__value_internal!({$($map)*})] $($rest)*)
71 };
72
73 (@seq [$($elems:expr,)*] $next:expr, $($rest:tt)*) => {
75 $crate::__value_internal!(@seq [$($elems,)* $crate::__value_internal!($next),] $($rest)*)
76 };
77
78 (@seq [$($elems:expr,)*] $last:expr) => {
80 $crate::__value_internal!(@seq [$($elems,)* $crate::__value_internal!($last)])
81 };
82
83 (@seq [$($elems:expr),*] , $($rest:tt)*) => {
85 $crate::__value_internal!(@seq [$($elems,)*] $($rest)*)
86 };
87
88 (@seq [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => {
90 $crate::__value_unexpected!($unexpected)
91 };
92
93 (@map $map:ident () () ()) => {};
100
101 (@map $map:ident [$($key:tt)+] ($value:expr) , $($rest:tt)*) => {
103 let _ = $map.insert(($($key)+), $value);
104 $crate::__value_internal!(@map $map () ($($rest)*) ($($rest)*));
105 };
106
107 (@map $map:ident [$($key:tt)+] ($value:expr) $unexpected:tt $($rest:tt)*) => {
109 $crate::__value_unexpected!($unexpected);
110 };
111
112 (@map $map:ident [$($key:tt)+] ($value:expr)) => {
114 let _ = $map.insert(($($key)+), $value);
115 };
116
117 (@map $map:ident ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => {
119 $crate::__value_internal!(@map $map [$($key)+] ($crate::__value_internal!(null)) $($rest)*);
120 };
121
122 (@map $map:ident ($($key:tt)+) (: true $($rest:tt)*) $copy:tt) => {
124 $crate::__value_internal!(@map $map [$($key)+] ($crate::__value_internal!(true)) $($rest)*);
125 };
126
127 (@map $map:ident ($($key:tt)+) (: false $($rest:tt)*) $copy:tt) => {
129 $crate::__value_internal!(@map $map [$($key)+] ($crate::__value_internal!(false)) $($rest)*);
130 };
131
132 (@map $map:ident ($($key:tt)+) (: [$($seq:tt)*] $($rest:tt)*) $copy:tt) => {
134 $crate::__value_internal!(@map $map [$($key)+] ($crate::__value_internal!([$($seq)*])) $($rest)*);
135 };
136
137 (@map $map:ident ($($key:tt)+) (: {$($inner:tt)*} $($rest:tt)*) $copy:tt) => {
139 $crate::__value_internal!(@map $map [$($key)+] ($crate::__value_internal!({$($inner)*})) $($rest)*);
140 };
141
142 (@map $map:ident ($($key:tt)+) (: $value:expr , $($rest:tt)*) $copy:tt) => {
144 $crate::__value_internal!(@map $map [$($key)+] ($crate::__value_internal!($value)) , $($rest)*);
145 };
146
147 (@map $map:ident ($($key:tt)+) (: $value:expr) $copy:tt) => {
149 $crate::__value_internal!(@map $map [$($key)+] ($crate::__value_internal!($value)));
150 };
151
152 (@map $map:ident ($($key:tt)+) (:) $copy:tt) => {
154 $crate::__value_internal!();
156 };
157
158 (@map $map:ident ($($key:tt)+) () $copy:tt) => {
161 $crate::__value_internal!();
163 };
164
165 (@map $map:ident () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => {
167 $crate::__value_unexpected!($colon);
169 };
170
171 (@map $map:ident ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => {
173 $crate::__value_unexpected!($comma);
175 };
176
177 (@map $map:ident () (($key:expr) : $($rest:tt)*) $copy:tt) => {
180 $crate::__value_internal!(@map $map ($key) (: $($rest)*) (: $($rest)*));
181 };
182
183 (@map $map:ident () ([$($key:tt)*] : $($rest:tt)*) $copy:tt) => {
185 $crate::__value_internal!(@map $map ($crate::__value_internal!([$($key)*])) (: $($rest)*) (: $($rest)*));
186 };
187
188 (@map $map:ident () ({$($key:tt)*} : $($rest:tt)*) $copy:tt) => {
190 $crate::__value_internal!(@map $map ($crate::__value_internal!({$($key)*})) (: $($rest)*) (: $($rest)*));
191 };
192
193 (@map $map:ident () (null : $($rest:tt)*) $copy:tt) => {
195 $crate::__value_internal!(@map $map ($crate::__value_internal!(null)) (: $($rest)*) (: $($rest)*));
196 };
197
198 (@map $map:ident ($($key:tt)*) (: $($unexpected:tt)+) $copy:tt) => {
200 $crate::__value_expect_expr_comma!($($unexpected)+);
201 };
202
203 (@map $map:ident ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
205 $crate::__value_internal!(@map $map ($($key)* $tt) ($($rest)*) ($($rest)*));
206 };
207
208 (null) => {
211 $crate::Value::null()
212 };
213
214 (true) => {
215 $crate::Value::from(true)
216 };
217
218 (false) => {
219 $crate::Value::from(false)
220 };
221
222 ([]) => {
223 $crate::Value::from($crate::Seq::new())
224 };
225
226 ([ $($tt:tt)+ ]) => {
227 $crate::Value::from($crate::__value_internal!(@seq [] $($tt)+))
228 };
229
230 ({}) => {
231 $crate::Value::from($crate::Map::new())
232 };
233
234 ({ $($tt:tt)+ }) => {
235 $crate::Value::from({
236 let mut map = $crate::Map::new();
237 $crate::__value_internal!(@map map () ($($tt)+) ($($tt)+));
238 map
239 })
240 };
241
242 ($other:expr) => {
244 $crate::Value::from($other)
245 };
246}
247
248#[macro_export]
249#[doc(hidden)]
250macro_rules! __value_unexpected {
251 () => {};
252}
253
254#[macro_export]
255#[doc(hidden)]
256macro_rules! __value_expect_expr_comma {
257 ($e:expr , $($tt:tt)*) => {};
258}