pub use serde::de::{Deserialize, IntoDeserializer};
#[macro_export]
macro_rules! sane {
($($sane:tt)+) => {{
let map = $crate::value::Map::new();
let mut root = $crate::Value::Map(map);
sane_internal!(@toplevel root [] $($sane)+);
root
}};
}
#[macro_export]
#[doc(hidden)]
macro_rules! sane_internal {
(@toplevel $root:ident [$($path:tt)*]) => {};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = - $v:tt $($rest:tt)*) => {
sane_internal!(@toplevel $root [$($path)*] $($($k)-+).+ = (-$v) $($rest)*);
};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = + $v:tt $($rest:tt)*) => {
sane_internal!(@toplevel $root [$($path)*] $($($k)-+).+ = ($v) $($rest)*);
};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = $yr:tt - $mo:tt - $dhr:tt : $min:tt : $sec:tt . $frac:tt - $tzh:tt : $tzm:tt $($rest:tt)*) => {
sane_internal!(@topleveldatetime $root [$($path)*] $($($k)-+).+ = ($yr - $mo - $dhr : $min : $sec . $frac - $tzh : $tzm) $($rest)*);
};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = $yr:tt - $mo:tt - $day:tt $hr:tt : $min:tt : $sec:tt . $frac:tt - $tzh:tt : $tzm:tt $($rest:tt)*) => {
sane_internal!(@topleveldatetime $root [$($path)*] $($($k)-+).+ = ($yr - $mo - $day T $hr : $min : $sec . $frac - $tzh : $tzm) $($rest)*);
};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = $yr:tt - $mo:tt - $dhr:tt : $min:tt : $sec:tt - $tzh:tt : $tzm:tt $($rest:tt)*) => {
sane_internal!(@topleveldatetime $root [$($path)*] $($($k)-+).+ = ($yr - $mo - $dhr : $min : $sec - $tzh : $tzm) $($rest)*);
};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = $yr:tt - $mo:tt - $day:tt $hr:tt : $min:tt : $sec:tt - $tzh:tt : $tzm:tt $($rest:tt)*) => {
sane_internal!(@topleveldatetime $root [$($path)*] $($($k)-+).+ = ($yr - $mo - $day T $hr : $min : $sec - $tzh : $tzm) $($rest)*);
};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = $yr:tt - $mo:tt - $dhr:tt : $min:tt : $sec:tt . $frac:tt $($rest:tt)*) => {
sane_internal!(@topleveldatetime $root [$($path)*] $($($k)-+).+ = ($yr - $mo - $dhr : $min : $sec . $frac) $($rest)*);
};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = $yr:tt - $mo:tt - $day:tt $hr:tt : $min:tt : $sec:tt . $frac:tt $($rest:tt)*) => {
sane_internal!(@topleveldatetime $root [$($path)*] $($($k)-+).+ = ($yr - $mo - $day T $hr : $min : $sec . $frac) $($rest)*);
};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = $yr:tt - $mo:tt - $dhr:tt : $min:tt : $sec:tt $($rest:tt)*) => {
sane_internal!(@topleveldatetime $root [$($path)*] $($($k)-+).+ = ($yr - $mo - $dhr : $min : $sec) $($rest)*);
};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = $yr:tt - $mo:tt - $day:tt $hr:tt : $min:tt : $sec:tt $($rest:tt)*) => {
sane_internal!(@topleveldatetime $root [$($path)*] $($($k)-+).+ = ($yr - $mo - $day T $hr : $min : $sec) $($rest)*);
};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = $yr:tt - $mo:tt - $day:tt $($rest:tt)*) => {
sane_internal!(@topleveldatetime $root [$($path)*] $($($k)-+).+ = ($yr - $mo - $day) $($rest)*);
};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = $hr:tt : $min:tt : $sec:tt . $frac:tt $($rest:tt)*) => {
sane_internal!(@topleveldatetime $root [$($path)*] $($($k)-+).+ = ($hr : $min : $sec . $frac) $($rest)*);
};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = $hr:tt : $min:tt : $sec:tt $($rest:tt)*) => {
sane_internal!(@topleveldatetime $root [$($path)*] $($($k)-+).+ = ($hr : $min : $sec) $($rest)*);
};
(@toplevel $root:ident [$($path:tt)*] $($($k:tt)-+).+ = $v:tt $($rest:tt)*) => {{
$crate::macros::insert_sane(
&mut $root,
&[$($path)* $(&concat!($("-", sane_internal!(@path $k),)+)[1..], )+],
sane_internal!(@value $v));
sane_internal!(@toplevel $root [$($path)*] $($rest)*);
}};
(@toplevel $root:ident $oldpath:tt [[$($($path:tt)-+).+]] $($rest:tt)*) => {
$crate::macros::push_sane(
&mut $root,
&[$(&concat!($("-", sane_internal!(@path $path),)+)[1..],)+]);
sane_internal!(@toplevel $root [$(&concat!($("-", sane_internal!(@path $path),)+)[1..],)+] $($rest)*);
};
(@toplevel $root:ident $oldpath:tt [$($($path:tt)-+).+] $($rest:tt)*) => {
$crate::macros::insert_sane(
&mut $root,
&[$(&concat!($("-", sane_internal!(@path $path),)+)[1..],)+],
$crate::Value::Map($crate::value::Map::new()));
sane_internal!(@toplevel $root [$(&concat!($("-", sane_internal!(@path $path),)+)[1..],)+] $($rest)*);
};
(@topleveldatetime $root:ident [$($path:tt)*] $($($k:tt)-+).+ = ($($datetime:tt)+) $($rest:tt)*) => {
$crate::macros::insert_sane(
&mut $root,
&[$($path)* $(&concat!($("-", sane_internal!(@path $k),)+)[1..], )+],
$crate::Value::Datetime(concat!($(stringify!($datetime)),+).parse().unwrap()));
sane_internal!(@toplevel $root [$($path)*] $($rest)*);
};
(@path $ident:ident) => {
stringify!($ident)
};
(@path $quoted:tt) => {
$quoted
};
(@value { $($inline:tt)* }) => {{
let mut map = $crate::Value::Map($crate::value::Map::new());
sane_internal!(@trailingcomma (@map map) $($inline)*);
map
}};
(@value [ $($inline:tt)* ]) => {{
let mut list = $crate::value::List::new();
sane_internal!(@trailingcomma (@list list) $($inline)*);
$crate::Value::List(list)
}};
(@value (-nan)) => {
$crate::Value::Float(-::std::f64::NAN)
};
(@value (nan)) => {
$crate::Value::Float(::std::f64::NAN)
};
(@value nan) => {
$crate::Value::Float(::std::f64::NAN)
};
(@value (-inf)) => {
$crate::Value::Float(::std::f64::NEG_INFINITY)
};
(@value (inf)) => {
$crate::Value::Float(::std::f64::INFINITY)
};
(@value inf) => {
$crate::Value::Float(::std::f64::INFINITY)
};
(@value $v:tt) => {{
let de = $crate::macros::IntoDeserializer::<$crate::de::Error>::into_deserializer($v);
<$crate::Value as $crate::macros::Deserialize>::deserialize(de).unwrap()
}};
(@map $root:ident) => {};
(@map $root:ident $($($k:tt)-+).+ = - $v:tt , $($rest:tt)*) => {
sane_internal!(@map $root $($($k)-+).+ = (-$v) , $($rest)*);
};
(@map $root:ident $($($k:tt)-+).+ = + $v:tt , $($rest:tt)*) => {
sane_internal!(@map $root $($($k)-+).+ = ($v) , $($rest)*);
};
(@map $root:ident $($($k:tt)-+).+ = $yr:tt - $mo:tt - $dhr:tt : $min:tt : $sec:tt . $frac:tt - $tzh:tt : $tzm:tt , $($rest:tt)*) => {
sane_internal!(@mapdatetime $root $($($k)-+).+ = ($yr - $mo - $dhr : $min : $sec . $frac - $tzh : $tzm) $($rest)*);
};
(@map $root:ident $($($k:tt)-+).+ = $yr:tt - $mo:tt - $day:tt $hr:tt : $min:tt : $sec:tt . $frac:tt - $tzh:tt : $tzm:tt , $($rest:tt)*) => {
sane_internal!(@mapdatetime $root $($($k)-+).+ = ($yr - $mo - $day T $hr : $min : $sec . $frac - $tzh : $tzm) $($rest)*);
};
(@map $root:ident $($($k:tt)-+).+ = $yr:tt - $mo:tt - $dhr:tt : $min:tt : $sec:tt - $tzh:tt : $tzm:tt , $($rest:tt)*) => {
sane_internal!(@mapdatetime $root $($($k)-+).+ = ($yr - $mo - $dhr : $min : $sec - $tzh : $tzm) $($rest)*);
};
(@map $root:ident $($($k:tt)-+).+ = $yr:tt - $mo:tt - $day:tt $hr:tt : $min:tt : $sec:tt - $tzh:tt : $tzm:tt , $($rest:tt)*) => {
sane_internal!(@mapdatetime $root $($($k)-+).+ = ($yr - $mo - $day T $hr : $min : $sec - $tzh : $tzm) $($rest)*);
};
(@map $root:ident $($($k:tt)-+).+ = $yr:tt - $mo:tt - $dhr:tt : $min:tt : $sec:tt . $frac:tt , $($rest:tt)*) => {
sane_internal!(@mapdatetime $root $($($k)-+).+ = ($yr - $mo - $dhr : $min : $sec . $frac) $($rest)*);
};
(@map $root:ident $($($k:tt)-+).+ = $yr:tt - $mo:tt - $day:tt $hr:tt : $min:tt : $sec:tt . $frac:tt , $($rest:tt)*) => {
sane_internal!(@mapdatetime $root $($($k)-+).+ = ($yr - $mo - $day T $hr : $min : $sec . $frac) $($rest)*);
};
(@map $root:ident $($($k:tt)-+).+ = $yr:tt - $mo:tt - $dhr:tt : $min:tt : $sec:tt , $($rest:tt)*) => {
sane_internal!(@mapdatetime $root $($($k)-+).+ = ($yr - $mo - $dhr : $min : $sec) $($rest)*);
};
(@map $root:ident $($($k:tt)-+).+ = $yr:tt - $mo:tt - $day:tt $hr:tt : $min:tt : $sec:tt , $($rest:tt)*) => {
sane_internal!(@mapdatetime $root $($($k)-+).+ = ($yr - $mo - $day T $hr : $min : $sec) $($rest)*);
};
(@map $root:ident $($($k:tt)-+).+ = $yr:tt - $mo:tt - $day:tt , $($rest:tt)*) => {
sane_internal!(@mapdatetime $root $($($k)-+).+ = ($yr - $mo - $day) $($rest)*);
};
(@map $root:ident $($($k:tt)-+).+ = $hr:tt : $min:tt : $sec:tt . $frac:tt , $($rest:tt)*) => {
sane_internal!(@mapdatetime $root $($($k)-+).+ = ($hr : $min : $sec . $frac) $($rest)*);
};
(@map $root:ident $($($k:tt)-+).+ = $hr:tt : $min:tt : $sec:tt , $($rest:tt)*) => {
sane_internal!(@mapdatetime $root $($($k)-+).+ = ($hr : $min : $sec) $($rest)*);
};
(@map $root:ident $($($k:tt)-+).+ = $v:tt , $($rest:tt)*) => {
$crate::macros::insert_sane(
&mut $root,
&[$(&concat!($("-", sane_internal!(@path $k),)+)[1..], )+],
sane_internal!(@value $v));
sane_internal!(@map $root $($rest)*);
};
(@mapdatetime $root:ident $($($k:tt)-+).+ = ($($datetime:tt)*) $($rest:tt)*) => {
$crate::macros::insert_sane(
&mut $root,
&[$(&concat!($("-", sane_internal!(@path $k),)+)[1..], )+],
$crate::Value::Datetime(concat!($(stringify!($datetime)),+).parse().unwrap()));
sane_internal!(@map $root $($rest)*);
};
(@list $root:ident) => {};
(@list $root:ident - $v:tt , $($rest:tt)*) => {
sane_internal!(@list $root (-$v) , $($rest)*);
};
(@list $root:ident + $v:tt , $($rest:tt)*) => {
sane_internal!(@list $root ($v) , $($rest)*);
};
(@list $root:ident $yr:tt - $mo:tt - $dhr:tt : $min:tt : $sec:tt . $frac:tt - $tzh:tt : $tzm:tt , $($rest:tt)*) => {
sane_internal!(@listdatetime $root ($yr - $mo - $dhr : $min : $sec . $frac - $tzh : $tzm) $($rest)*);
};
(@list $root:ident $yr:tt - $mo:tt - $day:tt $hr:tt : $min:tt : $sec:tt . $frac:tt - $tzh:tt : $tzm:tt , $($rest:tt)*) => {
sane_internal!(@listdatetime $root ($yr - $mo - $day T $hr : $min : $sec . $frac - $tzh : $tzm) $($rest)*);
};
(@list $root:ident $yr:tt - $mo:tt - $dhr:tt : $min:tt : $sec:tt - $tzh:tt : $tzm:tt , $($rest:tt)*) => {
sane_internal!(@listdatetime $root ($yr - $mo - $dhr : $min : $sec - $tzh : $tzm) $($rest)*);
};
(@list $root:ident $yr:tt - $mo:tt - $day:tt $hr:tt : $min:tt : $sec:tt - $tzh:tt : $tzm:tt , $($rest:tt)*) => {
sane_internal!(@listdatetime $root ($yr - $mo - $day T $hr : $min : $sec - $tzh : $tzm) $($rest)*);
};
(@list $root:ident $yr:tt - $mo:tt - $dhr:tt : $min:tt : $sec:tt . $frac:tt , $($rest:tt)*) => {
sane_internal!(@listdatetime $root ($yr - $mo - $dhr : $min : $sec . $frac) $($rest)*);
};
(@list $root:ident $yr:tt - $mo:tt - $day:tt $hr:tt : $min:tt : $sec:tt . $frac:tt , $($rest:tt)*) => {
sane_internal!(@listdatetime $root ($yr - $mo - $day T $hr : $min : $sec . $frac) $($rest)*);
};
(@list $root:ident $yr:tt - $mo:tt - $dhr:tt : $min:tt : $sec:tt , $($rest:tt)*) => {
sane_internal!(@listdatetime $root ($yr - $mo - $dhr : $min : $sec) $($rest)*);
};
(@list $root:ident $yr:tt - $mo:tt - $day:tt $hr:tt : $min:tt : $sec:tt , $($rest:tt)*) => {
sane_internal!(@listdatetime $root ($yr - $mo - $day T $hr : $min : $sec) $($rest)*);
};
(@list $root:ident $yr:tt - $mo:tt - $day:tt , $($rest:tt)*) => {
sane_internal!(@listdatetime $root ($yr - $mo - $day) $($rest)*);
};
(@list $root:ident $hr:tt : $min:tt : $sec:tt . $frac:tt , $($rest:tt)*) => {
sane_internal!(@listdatetime $root ($hr : $min : $sec . $frac) $($rest)*);
};
(@list $root:ident $hr:tt : $min:tt : $sec:tt , $($rest:tt)*) => {
sane_internal!(@listdatetime $root ($hr : $min : $sec) $($rest)*);
};
(@list $root:ident $v:tt , $($rest:tt)*) => {
$root.push(sane_internal!(@value $v));
sane_internal!(@list $root $($rest)*);
};
(@listdatetime $root:ident ($($datetime:tt)*) $($rest:tt)*) => {
$root.push($crate::Value::Datetime(concat!($(stringify!($datetime)),+).parse().unwrap()));
sane_internal!(@list $root $($rest)*);
};
(@trailingcomma ($($args:tt)*)) => {
sane_internal!($($args)*);
};
(@trailingcomma ($($args:tt)*) ,) => {
sane_internal!($($args)* ,);
};
(@trailingcomma ($($args:tt)*) $last:tt) => {
sane_internal!($($args)* $last ,);
};
(@trailingcomma ($($args:tt)*) $first:tt $($rest:tt)+) => {
sane_internal!(@trailingcomma ($($args)* $first) $($rest)+);
};
}