#[macro_export]
macro_rules! nson {
(@array [$($elems:expr,)*]) => {
$crate::array::Array::from_vec($crate::vec![$($elems,)*])
};
(@array [$($elems:expr),*]) => {
$crate::array::Array::from_vec($crate::vec![$($elems,)*])
};
(@array [$($elems:expr,)*] null $($rest:tt)*) => {
$crate::nson!(@array [$($elems,)* $crate::nson!(null)] $($rest)*)
};
(@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => {
$crate::nson!(@array [$($elems,)* $crate::nson!([$($array)*])] $($rest)*)
};
(@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => {
$crate::nson!(@array [$($elems,)* $crate::nson!({$($map)*})] $($rest)*)
};
(@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => {
$crate::nson!(@array [$($elems,)* $crate::nson!($next),] $($rest)*)
};
(@array [$($elems:expr,)*] $last:expr) => {
$crate::nson!(@array [$($elems,)* $crate::nson!($last)])
};
(@array [$($elems:expr),*] , $($rest:tt)*) => {
$crate::nson!(@array [$($elems,)*] $($rest)*)
};
(@object $object:ident () () ()) => {};
(@object $object:ident [$($key:tt)+] ($value:expr) , $($rest:tt)*) => {
$object.insert_value(($($key)+), $value);
$crate::nson!(@object $object () ($($rest)*) ($($rest)*));
};
(@object $object:ident [$($key:tt)+] ($value:expr)) => {
$object.insert_value(($($key)+), $value);
};
(@object $object:ident ($($key:tt)+) (=> null $($rest:tt)*) $copy:tt) => {
$crate::nson!(@object $object [$($key)+] ($crate::nson!(null)) $($rest)*);
};
(@object $object:ident ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => {
$crate::nson!(@object $object [$($key)+] ($crate::nson!(null)) $($rest)*);
};
(@object $object:ident ($($key:tt)+) (=> [$($array:tt)*] $($rest:tt)*) $copy:tt) => {
$crate::nson!(@object $object [$($key)+] ($crate::nson!([$($array)*])) $($rest)*);
};
(@object $object:ident ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => {
$crate::nson!(@object $object [$($key)+] ($crate::nson!([$($array)*])) $($rest)*);
};
(@object $object:ident ($($key:tt)+) (=> {$($map:tt)*} $($rest:tt)*) $copy:tt) => {
$crate::nson!(@object $object [$($key)+] ($crate::nson!({$($map)*})) $($rest)*);
};
(@object $object:ident ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => {
$crate::nson!(@object $object [$($key)+] ($crate::nson!({$($map)*})) $($rest)*);
};
(@object $object:ident ($($key:tt)+) (=> $value:expr , $($rest:tt)*) $copy:tt) => {
$crate::nson!(@object $object [$($key)+] ($crate::nson!($value)) , $($rest)*);
};
(@object $object:ident ($($key:tt)+) (: $value:expr , $($rest:tt)*) $copy:tt) => {
$crate::nson!(@object $object [$($key)+] ($crate::nson!($value)) , $($rest)*);
};
(@object $object:ident ($($key:tt)+) (=> $value:expr) $copy:tt) => {
$crate::nson!(@object $object [$($key)+] ($crate::nson!($value)));
};
(@object $object:ident ($($key:tt)+) (: $value:expr) $copy:tt) => {
$crate::nson!(@object $object [$($key)+] ($crate::nson!($value)));
};
(@object $object:ident ($($key:tt)+) (=>) $copy:tt) => {
$crate::nson!();
};
(@object $object:ident ($($key:tt)+) (:) $copy:tt) => {
$crate::nson!();
};
(@object $object:ident ($($key:tt)+) () $copy:tt) => {
$crate::nson!();
};
(@object $object:ident () (=> $($rest:tt)*) ($kv_separator:tt $($copy:tt)*)) => {
unimplemented!($kv_separator);
};
(@object $object:ident () (: $($rest:tt)*) ($kv_separator:tt $($copy:tt)*)) => {
unimplemented!($kv_separator);
};
(@object $object:ident ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => {
unimplemented!($comma);
};
(@object $object:ident () (($key:expr) => $($rest:tt)*) $copy:tt) => {
$crate::nson!(@object $object ($key) (=> $($rest)*) (=> $($rest)*));
};
(@object $object:ident () (($key:expr) : $($rest:tt)*) $copy:tt) => {
$crate::nson!(@object $object ($key) (: $($rest)*) (: $($rest)*));
};
(@object $object:ident ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => {
$crate::nson!(@object $object ($($key)* $tt) ($($rest)*) ($($rest)*));
};
(null) => {
$crate::value::Value::Null
};
([]) => {
$crate::value::Value::Array($crate::vec![].into())
};
([ $($tt:tt)+ ]) => {
$crate::value::Value::Array($crate::nson!(@array [] $($tt)+))
};
({}) => {
$crate::value::Value::Map($crate::m!{})
};
({$($tt:tt)+}) => {
$crate::value::Value::Map($crate::m!{$($tt)+});
};
($other:expr) => {
core::convert::From::from($other)
};
}
#[macro_export]
macro_rules! m {
() => {{ $crate::map::Map::with_capacity(8) }};
( $($tt:tt)+ ) => {{
let mut object = $crate::map::Map::with_capacity(8);
$crate::nson!(@object object () ($($tt)+) ($($tt)+));
object
}};
}
#[macro_export]
macro_rules! a {
() => {{ $crate::array::Array::new() }};
( $($tt:tt)+ ) => {{
$crate::nson!(@array [] $($tt)+)
}};
}