async_graphql_value/
macros.rs1#[macro_export]
3macro_rules! value {
4 ($($json:tt)+) => {
5 $crate::value_internal!($($json)+)
6 };
7}
8
9#[macro_export]
10#[doc(hidden)]
11macro_rules! value_internal {
12 (@array [$($elems:expr,)*]) => {
14 $crate::value_internal_vec![$($elems,)*]
15 };
16
17 (@array [$($elems:expr),*]) => {
19 $crate::value_internal_vec![$($elems),*]
20 };
21
22 (@array [$($elems:expr,)*] null $($rest:tt)*) => {
24 $crate::value_internal!(@array [$($elems,)* $crate::value_internal!(null)] $($rest)*)
25 };
26
27 (@array [$($elems:expr,)*] true $($rest:tt)*) => {
29 $crate::value_internal!(@array [$($elems,)* $crate::value_internal!(true)] $($rest)*)
30 };
31
32 (@array [$($elems:expr,)*] false $($rest:tt)*) => {
34 $crate::value_internal!(@array [$($elems,)* $crate::value_internal!(false)] $($rest)*)
35 };
36
37 (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => {
39 $crate::value_internal!(@array [$($elems,)* $crate::value_internal!([$($array)*])] $($rest)*)
40 };
41
42 (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => {
44 $crate::value_internal!(@array [$($elems,)* $crate::value_internal!({$($map)*})] $($rest)*)
45 };
46
47 (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => {
49 $crate::value_internal!(@array [$($elems,)* $crate::value_internal!($next),] $($rest)*)
50 };
51
52 (@array [$($elems:expr,)*] $last:expr) => {
54 $crate::value_internal!(@array [$($elems,)* $crate::value_internal!($last)])
55 };
56
57 (@array [$($elems:expr),*] , $($rest:tt)*) => {
59 $crate::value_internal!(@array [$($elems,)*] $($rest)*)
60 };
61
62 (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => {
64 $crate::value_unexpected!($unexpected)
65 };
66
67 (@object $object:ident () () ()) => {};
69
70 (@object $object:ident [$($key:tt)+] ($value:expr) , $($rest:tt)*) => {
72 let _ = $object.insert($crate::Name::new($($key)+), $value);
73 $crate::value_internal!(@object $object () ($($rest)*) ($($rest)*));
74 };
75
76 (@object $object:ident [$($key:tt)+] ($value:expr) $unexpected:tt $($rest:tt)*) => {
78 $crate::value_unexpected!($unexpected);
79 };
80
81 (@object $object:ident [$($key:tt)+] ($value:expr)) => {
83 let _ = $object.insert($crate::Name::new($($key)+), $value);
84 };
85
86 (@object $object:ident ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => {
88 $crate::value_internal!(@object $object [$($key)+] ($crate::value_internal!(null)) $($rest)*);
89 };
90
91 (@object $object:ident ($($key:tt)+) (: true $($rest:tt)*) $copy:tt) => {
93 $crate::value_internal!(@object $object [$($key)+] ($crate::value_internal!(true)) $($rest)*);
94 };
95
96 (@object $object:ident ($($key:tt)+) (: false $($rest:tt)*) $copy:tt) => {
98 $crate::value_internal!(@object $object [$($key)+] ($crate::value_internal!(false)) $($rest)*);
99 };
100
101 (@object $object:ident ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => {
103 $crate::value_internal!(@object $object [$($key)+] ($crate::value_internal!([$($array)*])) $($rest)*);
104 };
105
106 (@object $object:ident ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => {
108 $crate::value_internal!(@object $object [$($key)+] ($crate::value_internal!({$($map)*})) $($rest)*);
109 };
110
111 (@object $object:ident ($($key:tt)+) (: $value:expr , $($rest:tt)*) $copy:tt) => {
113 $crate::value_internal!(@object $object [$($key)+] ($crate::value_internal!($value)) , $($rest)*);
114 };
115
116 (@object $object:ident ($($key:tt)+) (: $value:expr) $copy:tt) => {
118 $crate::value_internal!(@object $object [$($key)+] ($crate::value_internal!($value)));
119 };
120
121 (@object $object:ident ($($key:tt)+) (:) $copy:tt) => {
123 $crate::value_internal!();
125 };
126
127 (@object $object:ident ($($key:tt)+) () $copy:tt) => {
130 $crate::value_internal!();
132 };
133
134 (@object $object:ident () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => {
136 $crate::value_unexpected!($colon);
138 };
139
140 (@object $object:ident ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => {
142 $crate::value_unexpected!($comma);
144 };
145
146 (@object $object:ident () (($key:expr) : $($rest:tt)*) $copy:tt) => {
149 $crate::value_internal!(@object $object ($key) (: $($rest)*) (: $($rest)*));
150 };
151
152 (@object $object:ident ($($key:tt)*) (: $($unexpected:tt)+) $copy:tt) => {
154 $crate::value_expect_expr_comma!($($unexpected)+);
155 };
156
157 (@object $object:ident ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
159 $crate::value_internal!(@object $object ($($key)* $tt) ($($rest)*) ($($rest)*));
160 };
161
162 (null) => {
169 $crate::ConstValue::Null
170 };
171
172 (true) => {
173 $crate::ConstValue::Boolean(true)
174 };
175
176 (false) => {
177 $crate::ConstValue::Boolean(false)
178 };
179
180 ([]) => {
181 $crate::ConstValue::List($crate::value_internal_vec![])
182 };
183
184 ([ $($tt:tt)+ ]) => {
185 $crate::ConstValue::List($crate::value_internal!(@array [] $($tt)+))
186 };
187
188 ({}) => {
189 $crate::ConstValue::Object(Default::default())
190 };
191
192 ({ $($tt:tt)+ }) => {
193 $crate::ConstValue::Object({
194 let mut object = $crate::indexmap::IndexMap::new();
195 $crate::value_internal!(@object object () ($($tt)+) ($($tt)+));
196 object
197 })
198 };
199
200 ($other:expr) => {
203 $crate::to_value(&$other).unwrap()
204 };
205}
206
207#[macro_export]
208#[doc(hidden)]
209macro_rules! value_internal_vec {
210 ($($content:tt)*) => {
211 vec![$($content)*]
212 };
213}
214
215#[macro_export]
216#[doc(hidden)]
217macro_rules! value_unexpected {
218 () => {};
219}
220
221#[macro_export]
222#[doc(hidden)]
223macro_rules! value_expect_expr_comma {
224 ($e:expr , $($tt:tt)*) => {};
225}
226
227#[cfg(test)]
228mod tests {
229 use indexmap::IndexMap;
230
231 use crate::{ConstValue, Name};
232
233 #[test]
234 fn test_macro() {
235 assert_eq!(value!(1), ConstValue::Number(1.into()));
236 assert_eq!(value!(1 + 2), ConstValue::Number(3.into()));
237 assert_eq!(value!("abc"), ConstValue::String("abc".into()));
238 assert_eq!(value!(true), ConstValue::Boolean(true));
239 assert_eq!(
240 value!([1, 2, 3]),
241 ConstValue::List((1..=3).map(|n| ConstValue::Number(n.into())).collect())
242 );
243 assert_eq!(
244 value!([1, 2, 3,]),
245 ConstValue::List((1..=3).map(|n| ConstValue::Number(n.into())).collect())
246 );
247 assert_eq!(value!({"a": 10, "b": true}), {
248 let mut map = IndexMap::new();
249 map.insert(Name::new("a"), ConstValue::Number(10.into()));
250 map.insert(Name::new("b"), ConstValue::Boolean(true));
251 ConstValue::Object(map)
252 });
253 }
254}