#[macro_export]
macro_rules! json {
() => {
$crate::Value::Null
};
(null) => {
$crate::Value::Null
};
([ $($elems:tt)* ]) => {
$crate::Value::Array($crate::json_array_internal!([] $($elems)*))
};
({}) => {
$crate::Value::Object(Vec::new())
};
({ $($elems:tt)* }) => {
$crate::Value::Object($crate::json_object_internal!([] $($elems)*))
};
($v:expr) => {
$crate::Value::from($v)
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! json_array_internal {
([ $($elems:expr,)* ]) => {
vec![ $( $elems, )* ]
};
([ $($elems:expr),* ]) => {
vec![ $( $elems ),* ]
};
([ $($elems:expr,)* ] null $($rest:tt)*) => {
$crate::json_array_internal!([ $($elems,)* $crate::Value::Null, ])
};
([ $($elems:expr,)* ] [ $($array:tt)* ] $($rest:tt)*) => {
$crate::json_array_internal!([ $($elems,)* $crate::json!([ $($array)* ]), ] $($rest)*)
};
([ $($elems:expr,)* ] { $($object:tt)* } $($rest:tt)*) => {
$crate::json_array_internal!([ $($elems,)* $crate::json!({ $($object)* }), ] $($rest)*)
};
([ $($elems:expr,)* ] $value:expr, $($rest:tt)*) => {
$crate::json_array_internal!([ $($elems,)* $crate::json!($value), ] $($rest)*)
};
([ $($elems:expr,)* ] $value:expr) => {
$crate::json_array_internal!([ $($elems,)* $crate::json!($value) ])
};
([ $($elems:expr,)* ] , $($rest:tt)*) => {
$crate::json_array_internal!([ $($elems,)* ] $($rest)*)
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! json_object_internal {
([ $($elems:expr,)* ]) => {
vec![ $( $elems, )* ]
};
([ $($elems:expr),* ]) => {
vec![ $( $elems ),* ]
};
([ $($elems:expr,)* ] $key:tt : null $($rest:tt)*) => {
$crate::json_object_internal!([ $($elems,)* ($key.to_string(), $crate::Value::Null), ] $($rest)*)
};
([ $($elems:expr,)* ] $key:tt : [ $($array:tt)* ] $($rest:tt)*) => {
$crate::json_object_internal!([ $($elems,)* ($key.to_string(), $crate::json!([ $($array)* ])), ] $($rest)*)
};
([ $($elems:expr,)* ] $key:tt : { $($object:tt)* } $($rest:tt)*) => {
$crate::json_object_internal!([ $($elems,)* ($key.to_string(), $crate::json!({ $($object)* })), ] $($rest)*)
};
([ $($elems:expr,)* ] $key:tt : $value:expr, $($rest:tt)*) => {
$crate::json_object_internal!([ $($elems,)* ($key.to_string(), $crate::json!($value)), ] $($rest)*)
};
([ $($elems:expr,)* ] $key:tt : $value:expr) => {
$crate::json_object_internal!([ $($elems,)* ($key.to_string(), $crate::json!($value)), ])
};
([ $($elems:expr,)* ] , $($rest:tt)*) => {
$crate::json_object_internal!([ $($elems,)* ] $($rest)*)
};
}
#[macro_export]
macro_rules! json_map {
($t:ty, $($struct_field:tt => $json_field:expr),*) => {
impl $crate::traits::FromJson for $t {
fn from_json(value: &$crate::Value) -> Result<Self, $crate::error::ParseError> {
Ok(Self {
$($struct_field: $crate::traits::FromJson::from_json(value.get($json_field).unwrap_or(&$crate::Value::Null))?),*
})
}
}
impl $crate::traits::IntoJson for $t {
fn to_json(&self) -> $crate::Value {
$crate::json!({
$($json_field: (&self.$struct_field)),*
})
}
}
};
}