1mod buffer;
2pub mod client;
3mod leb;
4pub mod types;
5
6#[macro_export]
23macro_rules! value {
24 (@array [$($elems:expr,)*]) => {
35 std::vec![$($elems,)*]
36 };
37
38 (@array [$($elems:expr),*]) => {
40 std::vec![$($elems),*]
41 };
42
43 (@array [$($elems:expr,)*] null $($rest:tt)*) => {
45 $crate::value!(@array [$($elems,)* $crate::value!(null)] $($rest)*)
46 };
47
48 (@array [$($elems:expr,)*] true $($rest:tt)*) => {
50 $crate::value!(@array [$($elems,)* $crate::value!(true)] $($rest)*)
51 };
52
53 (@array [$($elems:expr,)*] false $($rest:tt)*) => {
55 $crate::value!(@array [$($elems,)* $crate::value!(false)] $($rest)*)
56 };
57
58 (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => {
60 $crate::value!(@array [$($elems,)* $crate::value!([$($array)*])] $($rest)*)
61 };
62
63 (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => {
65 $crate::value!(@array [$($elems,)* $crate::value!({$($map)*})] $($rest)*)
66 };
67
68 (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => {
70 $crate::value!(@array [$($elems,)* $crate::value!($next),] $($rest)*)
71 };
72
73 (@array [$($elems:expr,)*] $last:expr) => {
75 $crate::value!(@array [$($elems,)* $crate::value!($last)])
76 };
77
78 (@array [$($elems:expr),*] , $($rest:tt)*) => {
80 $crate::value!(@array [$($elems,)*] $($rest)*)
81 };
82
83 (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => {
85 $crate::value_unexpected!($unexpected)
86 };
87
88 (@object $object:ident () () ()) => {};
100
101 (@object $object:ident [$($key:tt)+] ($value:expr) , $($rest:tt)*) => {
103 let _ = $object.insert(($($key)+).into(), $value);
104 $crate::value!(@object $object () ($($rest)*) ($($rest)*));
105 };
106
107 (@object $object:ident [$($key:tt)+] ($value:expr) $unexpected:tt $($rest:tt)*) => {
109 $crate::value_unexpected!($unexpected);
110 };
111
112 (@object $object:ident [$($key:tt)+] ($value:expr)) => {
114 let _ = $object.insert(($($key)+).into(), $value);
115 };
116
117 (@object $object:ident ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => {
119 $crate::value!(@object $object [$($key)+] ($crate::value!(null)) $($rest)*);
120 };
121
122 (@object $object:ident ($($key:tt)+) (: true $($rest:tt)*) $copy:tt) => {
124 $crate::value!(@object $object [$($key)+] ($crate::value!(true)) $($rest)*);
125 };
126
127 (@object $object:ident ($($key:tt)+) (: false $($rest:tt)*) $copy:tt) => {
129 $crate::value!(@object $object [$($key)+] ($crate::value!(false)) $($rest)*);
130 };
131
132 (@object $object:ident ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => {
134 $crate::value!(@object $object [$($key)+] ($crate::value!([$($array)*])) $($rest)*);
135 };
136
137 (@object $object:ident ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => {
139 $crate::value!(@object $object [$($key)+] ($crate::value!({$($map)*})) $($rest)*);
140 };
141
142 (@object $object:ident ($($key:tt)+) (: $value:expr , $($rest:tt)*) $copy:tt) => {
144 $crate::value!(@object $object [$($key)+] ($crate::value!($value)) , $($rest)*);
145 };
146
147 (@object $object:ident ($($key:tt)+) (: $value:expr) $copy:tt) => {
149 $crate::value!(@object $object [$($key)+] ($crate::value!($value)));
150 };
151
152 (@object $object:ident ($($key:tt)+) (:) $copy:tt) => {
154 $crate::value!();
156 };
157
158 (@object $object:ident ($($key:tt)+) () $copy:tt) => {
161 $crate::value!();
163 };
164
165 (@object $object:ident () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => {
167 $crate::value_unexpected!($colon);
169 };
170
171 (@object $object:ident ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => {
173 $crate::value_unexpected!($comma);
175 };
176
177 (@object $object:ident () (($key:expr) : $($rest:tt)*) $copy:tt) => {
180 $crate::value!(@object $object ($key) (: $($rest)*) (: $($rest)*));
181 };
182
183 (@object $object:ident ($($key:tt)*) (: $($unexpected:tt)+) $copy:tt) => {
185 $crate::value_expect_expr_comma!($($unexpected)+);
186 };
187
188 (@object $object:ident ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
190 $crate::value!(@object $object ($($key)* $tt) ($($rest)*) ($($rest)*));
191 };
192
193 (null) => {
200 $crate::types::Value::Null
201 };
202
203 (true) => {
204 $crate::types::Value::Bool(true)
205 };
206
207 (false) => {
208 $crate::types::Value::Bool(false)
209 };
210
211 ([]) => {
212 $crate::types::Value::Array(std::vec![])
213 };
214
215 ([ $($tt:tt)+ ]) => {
216 $crate::types::Value::Array($crate::value!(@array [] $($tt)+))
217 };
218
219 ({}) => {
220 $crate::types::Value::Struct(std::collections::HashMap::new())
221 };
222
223 ({ $($tt:tt)+ }) => {
224 $crate::types::Value::Struct({
225 let mut object = std::collections::HashMap::new();
226 $crate::value!(@object object () ($($tt)+) ($($tt)+));
227 object
228 })
229 };
230
231 ($other:expr) => {
234 $crate::types::Value::from(&$other)
235 };
236}
237
238#[macro_export]
239#[doc(hidden)]
240macro_rules! value_unexpected {
241 () => {};
242}
243
244#[macro_export]
245#[doc(hidden)]
246macro_rules! value_expect_expr_comma {
247 ($e:expr , $($tt:tt)*) => {};
248}