1#[macro_export(local_inner_macros)]
23macro_rules! liquid_value {
24 ($($value:tt)+) => {
25 value_internal!($($value)+)
26 };
27}
28
29#[macro_export(local_inner_macros)]
30#[doc(hidden)]
31macro_rules! value_internal {
32 (@array [$($elems:expr,)*]) => {
34 value_internal_vec![$($elems,)*]
35 };
36
37 (@array [$($elems:expr),*]) => {
39 value_internal_vec![$($elems),*]
40 };
41
42 (@array [$($elems:expr,)*] nil $($rest:tt)*) => {
44 value_internal!(@array [$($elems,)* value_internal!(nil)] $($rest)*)
45 };
46
47 (@array [$($elems:expr,)*] true $($rest:tt)*) => {
49 value_internal!(@array [$($elems,)* value_internal!(true)] $($rest)*)
50 };
51
52 (@array [$($elems:expr,)*] false $($rest:tt)*) => {
54 value_internal!(@array [$($elems,)* value_internal!(false)] $($rest)*)
55 };
56
57 (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => {
59 value_internal!(@array [$($elems,)* value_internal!([$($array)*])] $($rest)*)
60 };
61
62 (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => {
64 value_internal!(@array [$($elems,)* value_internal!({$($map)*})] $($rest)*)
65 };
66
67 (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => {
69 value_internal!(@array [$($elems,)* value_internal!($next),] $($rest)*)
70 };
71
72 (@array [$($elems:expr,)*] $last:expr) => {
74 value_internal!(@array [$($elems,)* value_internal!($last)])
75 };
76
77 (@array [$($elems:expr),*] , $($rest:tt)*) => {
79 value_internal!(@array [$($elems,)*] $($rest)*)
80 };
81
82 (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => {
84 value_unexpected!($unexpected)
85 };
86
87 (@object $object:ident () () ()) => {};
99
100 (@object $object:ident [$($key:tt)+] ($value:expr) , $($rest:tt)*) => {
102 let _ = $object.insert(($($key)+).into(), $value);
103 value_internal!(@object $object () ($($rest)*) ($($rest)*));
104 };
105
106 (@object $object:ident [$($key:tt)+] ($value:expr) $unexpected:tt $($rest:tt)*) => {
108 value_unexpected!($unexpected);
109 };
110
111 (@object $object:ident [$($key:tt)+] ($value:expr)) => {
113 let _ = $object.insert(($($key)+).into(), $value);
114 };
115
116 (@object $object:ident ($($key:tt)+) (: nil $($rest:tt)*) $copy:tt) => {
118 value_internal!(@object $object [$($key)+] (value_internal!(nil)) $($rest)*);
119 };
120
121 (@object $object:ident ($($key:tt)+) (: true $($rest:tt)*) $copy:tt) => {
123 value_internal!(@object $object [$($key)+] (value_internal!(true)) $($rest)*);
124 };
125
126 (@object $object:ident ($($key:tt)+) (: false $($rest:tt)*) $copy:tt) => {
128 value_internal!(@object $object [$($key)+] (value_internal!(false)) $($rest)*);
129 };
130
131 (@object $object:ident ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => {
133 value_internal!(@object $object [$($key)+] (value_internal!([$($array)*])) $($rest)*);
134 };
135
136 (@object $object:ident ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => {
138 value_internal!(@object $object [$($key)+] (value_internal!({$($map)*})) $($rest)*);
139 };
140
141 (@object $object:ident ($($key:tt)+) (: $value:expr , $($rest:tt)*) $copy:tt) => {
143 value_internal!(@object $object [$($key)+] (value_internal!($value)) , $($rest)*);
144 };
145
146 (@object $object:ident ($($key:tt)+) (: $value:expr) $copy:tt) => {
148 value_internal!(@object $object [$($key)+] (value_internal!($value)));
149 };
150
151 (@object $object:ident ($($key:tt)+) (:) $copy:tt) => {
153 value_internal!();
155 };
156
157 (@object $object:ident ($($key:tt)+) () $copy:tt) => {
160 value_internal!();
162 };
163
164 (@object $object:ident () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => {
166 value_unexpected!($colon);
168 };
169
170 (@object $object:ident ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => {
172 value_unexpected!($comma);
174 };
175
176 (@object $object:ident () (($key:expr) : $($rest:tt)*) $copy:tt) => {
179 value_internal!(@object $object ($key) (: $($rest)*) (: $($rest)*));
180 };
181
182 (@object $object:ident ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
184 value_internal!(@object $object ($($key)* $tt) ($($rest)*) ($($rest)*));
185 };
186
187 (nil) => {
194 $crate::Value::Nil
195 };
196
197 (true) => {
198 $crate::Value::scalar(true)
199 };
200
201 (false) => {
202 $crate::Value::scalar(false)
203 };
204
205 ([]) => {
206 $crate::Value::Array(value_internal_vec![])
207 };
208
209 ([ $($tt:tt)+ ]) => {
210 $crate::Value::Array(value_internal!(@array [] $($tt)+))
211 };
212
213 ({}) => {
214 $crate::Value::Object(Default::default())
215 };
216
217 ({ $($tt:tt)+ }) => {
218 $crate::Value::Object({
219 let mut object = $crate::Object::new();
220 value_internal!(@object object () ($($tt)+) ($($tt)+));
221 object
222 })
223 };
224
225 ($other:ident) => {
226 $other
227 };
228
229 ($other:expr) => {
232 $crate::to_value($other).unwrap()
233 };
234}
235
236#[macro_export]
237#[doc(hidden)]
238macro_rules! value_internal_vec {
239 ($($content:tt)*) => {
240 vec![$($content)*]
241 };
242}