#[macro_export]
macro_rules! from_json {
(
#[bourne(deny_unknown_fields = false)]
$(#[$attr:meta])*
$vis:vis struct $name:ident { $($body:tt)* }
) => {
$crate::__from_json_emit_struct_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
body: ($($body)*)
);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_named_body!(__lex, (Self), lenient, $($body)*)
}
}
};
(
#[bourne(deny_unknown_fields = false)]
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime $(,)? > { $($body:tt)* }
) => {
$crate::__from_json_emit_struct_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
body: ($($body)*)
);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_named_body!(__lex, (Self), lenient, $($body)*)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident { $($body:tt)* }
) => {
$crate::__from_json_emit_struct_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
body: ($($body)*)
);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_named_body!(__lex, (Self), strict, $($body)*)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime $(,)? > { $($body:tt)* }
) => {
$crate::__from_json_emit_struct_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
body: ($($body)*)
);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_named_body!(__lex, (Self), strict, $($body)*)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime, $tp:ident $(: $($tb:tt)+)? $(,)? > { $($body:tt)* }
) => {
$crate::__from_json_emit_struct_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt, $tp $(: $($tb)+)?>),
body: ($($body)*)
);
impl<$lt, $tp> $crate::FromJson<$lt> for $name<$lt, $tp>
where
$tp: $crate::FromJson<$lt> $($(+ $tb)+)?,
{
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_named_body!(__lex, (Self), strict, $($body)*)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $tp:ident $(: $($tb:tt)+)? $(,)? > { $($body:tt)* }
) => {
$crate::__from_json_emit_struct_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$tp $(: $($tb)+)?>),
body: ($($body)*)
);
impl<'input, $tp> $crate::FromJson<'input> for $name<$tp>
where
$tp: $crate::FromJson<'input> $($(+ $tb)+)?,
{
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_named_body!(__lex, (Self), strict, $($body)*)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident ( $fty:ty $(,)? ) ;
) => {
$(#[$attr])*
$vis struct $name($fty);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
::core::result::Result::Ok(Self(
<$fty as $crate::FromJson<'_>>::from_lex(__lex)?,
))
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime $(,)? > ( $fty:ty $(,)? ) ;
) => {
$(#[$attr])*
$vis struct $name<$lt>($fty);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
::core::result::Result::Ok(Self(
<$fty as $crate::FromJson<$lt>>::from_lex(__lex)?,
))
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident ( $fty1:ty, $($ftyn:ty),+ $(,)? ) ;
) => {
$(#[$attr])*
$vis struct $name($fty1, $($ftyn),+);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
if __lex.array_start()? {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, __lex.position()),
);
}
let __elem_0 = <$fty1 as $crate::FromJson<'_>>::from_lex(__lex)?;
$crate::__from_json_tuple_walk!(
lex: __lex,
self_ctor: (Self),
accum: [ __elem_0 ],
remaining: [ $(($ftyn))+ ]
)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime $(,)? > ( $fty1:ty, $($ftyn:ty),+ $(,)? ) ;
) => {
$(#[$attr])*
$vis struct $name<$lt>($fty1, $($ftyn),+);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
if __lex.array_start()? {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, __lex.position()),
);
}
let __elem_0 = <$fty1 as $crate::FromJson<$lt>>::from_lex(__lex)?;
$crate::__from_json_tuple_walk!(
lex: __lex,
self_ctor: (Self),
accum: [ __elem_0 ],
remaining: [ $(($ftyn))+ ]
)
}
}
};
(
#[bourne(untagged)]
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
variants_input: ($($variants)*)
);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_untagged_dispatch!(__lex, $name, ($($variants)*))
}
}
};
(
#[bourne(untagged)]
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
variants_input: ($($variants)*)
);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_untagged_dispatch!(__lex, $name, ($($variants)*))
}
}
};
(
#[bourne(tag = $tag:literal, content = $content:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
variants_input: ($($variants)*)
);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_adjacently_tagged_dispatch!(
__lex, $name, $tag, $content, ($($variants)*)
)
}
}
};
(
#[bourne(tag = $tag:literal, content = $content:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
variants_input: ($($variants)*)
);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_adjacently_tagged_dispatch!(
__lex, $name, $tag, $content, ($($variants)*)
)
}
}
};
(
#[bourne(tag = $tag:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
variants_input: ($($variants)*)
);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_internally_tagged_dispatch!(
__lex, $name, $tag, ($($variants)*)
)
}
}
};
(
#[bourne(tag = $tag:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
variants_input: ($($variants)*)
);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_internally_tagged_dispatch!(
__lex, $name, $tag, ($($variants)*)
)
}
}
};
(
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
variants_input: ($($variants)*)
);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_enum_dispatch!(__lex, $name, ($($variants)*))
}
}
};
(
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
variants_input: ($($variants)*)
);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_enum_dispatch!(__lex, $name, ($($variants)*))
}
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_emit_struct_def {
(
attrs: { $(#[$attr:meta])* },
vis: $vis:vis,
name: $name:ident,
generics_def: (),
body: ($($body:tt)*)
) => {
$crate::__from_json_strip_walk!(
done: {
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics: ()
},
kept: { },
cur: [],
input: ($($body)*)
);
};
(
attrs: { $(#[$attr:meta])* },
vis: $vis:vis,
name: $name:ident,
generics_def: (<$lt:lifetime>),
body: ($($body:tt)*)
) => {
$crate::__from_json_strip_walk!(
done: {
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics: (<$lt>)
},
kept: { },
cur: [],
input: ($($body)*)
);
};
(
attrs: { $(#[$attr:meta])* },
vis: $vis:vis,
name: $name:ident,
generics_def: (<$tp:ident $(: $($tb:tt)+)?>),
body: ($($body:tt)*)
) => {
$crate::__from_json_strip_walk!(
done: {
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics: (<$tp $(: $($tb)+)?>)
},
kept: { },
cur: [],
input: ($($body)*)
);
};
(
attrs: { $(#[$attr:meta])* },
vis: $vis:vis,
name: $name:ident,
generics_def: (<$lt:lifetime, $tp:ident $(: $($tb:tt)+)?>),
body: ($($body:tt)*)
) => {
$crate::__from_json_strip_walk!(
done: {
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics: (<$lt, $tp $(: $($tb)+)?>)
},
kept: { },
cur: [],
input: ($($body)*)
);
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_strip_walk {
(
done: {
attrs: { $(#[$outer:meta])* },
vis: $vis:vis,
name: $name:ident,
generics: ()
},
kept: { $($kept:tt)* },
cur: [],
input: ()
) => {
$(#[$outer])*
$vis struct $name { $($kept)* }
};
(
done: {
attrs: { $(#[$outer:meta])* },
vis: $vis:vis,
name: $name:ident,
generics: ($($g:tt)+)
},
kept: { $($kept:tt)* },
cur: [],
input: ()
) => {
$(#[$outer])*
$vis struct $name $($g)+ { $($kept)* }
};
// bourne(rename = "x") attribute: drop it.
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( #[bourne(rename = $_lit:literal)] $($rest:tt)* )
) => {
$crate::__from_json_strip_walk!(
done: $done,
kept: { $($kept)* },
cur: [ $($cur)* ],
input: ($($rest)*)
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( #[bourne(default)] $($rest:tt)* )
) => {
$crate::__from_json_strip_walk!(
done: $done,
kept: { $($kept)* },
cur: [ $($cur)* ],
input: ($($rest)*)
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( #[bourne(default = $_path:literal)] $($rest:tt)* )
) => {
$crate::__from_json_strip_walk!(
done: $done,
kept: { $($kept)* },
cur: [ $($cur)* ],
input: ($($rest)*)
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( #[bourne(skip)] $($rest:tt)* )
) => {
$crate::__from_json_strip_walk!(
done: $done,
kept: { $($kept)* },
cur: [ $($cur)* ],
input: ($($rest)*)
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( #[bourne(skip_if_none)] $($rest:tt)* )
) => {
$crate::__from_json_strip_walk!(
done: $done,
kept: { $($kept)* },
cur: [ $($cur)* ],
input: ($($rest)*)
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( #[bourne(rename = $_lit:literal, default)] $($rest:tt)* )
) => {
$crate::__from_json_strip_walk!(
done: $done,
kept: { $($kept)* },
cur: [ $($cur)* ],
input: ($($rest)*)
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( #[$other:meta] $($rest:tt)* )
) => {
$crate::__from_json_strip_walk!(
done: $done,
kept: { $($kept)* },
cur: [ $($cur)* #[$other] ],
input: ($($rest)*)
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( $fvis:vis $fname:ident : $fty:ty , $($rest:tt)* )
) => {
$crate::__from_json_strip_walk!(
done: $done,
kept: {
$($kept)*
$($cur)* $fvis $fname: $fty,
},
cur: [],
input: ($($rest)*)
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( $fvis:vis $fname:ident : $fty:ty )
) => {
$crate::__from_json_strip_walk!(
done: $done,
kept: {
$($kept)*
$($cur)* $fvis $fname: $fty,
},
cur: [],
input: ()
);
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_emit_enum_def {
(
attrs: { $(#[$attr:meta])* },
vis: $vis:vis,
name: $name:ident,
generics_def: (),
variants_input: ($($variants:tt)*)
) => {
$crate::__from_json_enum_strip!(
done: {
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics: ()
},
kept: { },
cur: [],
input: ($($variants)*)
);
};
(
attrs: { $(#[$attr:meta])* },
vis: $vis:vis,
name: $name:ident,
generics_def: (<$lt:lifetime>),
variants_input: ($($variants:tt)*)
) => {
$crate::__from_json_enum_strip!(
done: {
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics: (<$lt>)
},
kept: { },
cur: [],
input: ($($variants)*)
);
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_enum_strip {
(
done: {
attrs: { $(#[$outer:meta])* },
vis: $vis:vis,
name: $name:ident,
generics: ()
},
kept: { $($kept:tt)* },
cur: [],
input: ()
) => {
$(#[$outer])*
$vis enum $name { $($kept)* }
};
(
done: {
attrs: { $(#[$outer:meta])* },
vis: $vis:vis,
name: $name:ident,
generics: ($($g:tt)+)
},
kept: { $($kept:tt)* },
cur: [],
input: ()
) => {
$(#[$outer])*
$vis enum $name $($g)+ { $($kept)* }
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( #[bourne(rename = $_lit:literal)] $($rest:tt)* )
) => {
$crate::__from_json_enum_strip!(
done: $done,
kept: { $($kept)* },
cur: [ $($cur)* ],
input: ($($rest)*)
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( #[$other:meta] $($rest:tt)* )
) => {
$crate::__from_json_enum_strip!(
done: $done,
kept: { $($kept)* },
cur: [ $($cur)* #[$other] ],
input: ($($rest)*)
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( $vname:ident , $($rest:tt)* )
) => {
$crate::__from_json_enum_strip!(
done: $done,
kept: { $($kept)* $($cur)* $vname, },
cur: [],
input: ($($rest)*)
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( $vname:ident )
) => {
$crate::__from_json_enum_strip!(
done: $done,
kept: { $($kept)* $($cur)* $vname, },
cur: [],
input: ()
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( $vname:ident ( $($body:tt)* ) , $($rest:tt)* )
) => {
$crate::__from_json_enum_strip!(
done: $done,
kept: { $($kept)* $($cur)* $vname($($body)*), },
cur: [],
input: ($($rest)*)
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( $vname:ident ( $($body:tt)* ) )
) => {
$crate::__from_json_enum_strip!(
done: $done,
kept: { $($kept)* $($cur)* $vname($($body)*), },
cur: [],
input: ()
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( $vname:ident { $($body:tt)* } , $($rest:tt)* )
) => {
$crate::__from_json_enum_strip!(
done: $done,
kept: { $($kept)* $($cur)* $vname { $($body)* }, },
cur: [],
input: ($($rest)*)
);
};
(
done: $done:tt,
kept: { $($kept:tt)* },
cur: [ $($cur:tt)* ],
input: ( $vname:ident { $($body:tt)* } )
) => {
$crate::__from_json_enum_strip!(
done: $done,
kept: { $($kept)* $($cur)* $vname { $($body)* }, },
cur: [],
input: ()
);
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_enum_dispatch {
($lex:ident, $name:ident, ($($variants:tt)*)) => {
$crate::__from_json_enum_walk!(
lex: $lex,
name: $name,
unit_arms: { },
tagged_arms: { },
cur_rename: (),
has_tagged: (),
input: ($($variants)*)
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_enum_walk {
(
lex: $lex:ident,
name: $name:ident,
unit_arms: { $($unit:tt)* },
tagged_arms: { },
cur_rename: (),
has_tagged: (),
input: ()
) => {
match $lex.peek_value_kind()? {
$crate::ValueKind::String => {
let __tag = $lex.parse_str_value()?;
match __tag {
$($unit)*
_ => ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::UnknownField, $lex.position()),
),
}
}
_ => ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, $lex.position()),
),
}
};
(
lex: $lex:ident,
name: $name:ident,
unit_arms: { $($unit:tt)* },
tagged_arms: { $($tagged:tt)* },
cur_rename: (),
has_tagged: ($_h:tt $($_hrest:tt)*),
input: ()
) => {
match $lex.peek_value_kind()? {
$crate::ValueKind::String => {
let __tag = $lex.parse_str_value()?;
match __tag {
$($unit)*
_ => ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::UnknownField, $lex.position()),
),
}
}
$crate::ValueKind::Object => {
$lex.object_start()?;
let __key_js = $lex.object_first_key_lex()?.ok_or_else(|| {
$crate::Error::new($crate::ErrorKind::UnknownField, $lex.position())
})?;
let __key_cow = $crate::key_to_cow(__key_js, $lex)?;
let __value = match __key_cow.as_ref() {
$($tagged)*
_ => return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::UnknownField, $lex.position()),
),
};
if $lex.object_next_key_lex()?.is_some() {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::UnknownField, $lex.position()),
);
}
::core::result::Result::Ok(__value)
}
_ => ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, $lex.position()),
),
}
};
(
lex: $lex:ident,
name: $name:ident,
unit_arms: $u:tt,
tagged_arms: $t:tt,
cur_rename: (),
has_tagged: ($($h:tt)*),
input: ( #[bourne(rename = $renamed:literal)] $($rest:tt)* )
) => {
$crate::__from_json_enum_walk!(
lex: $lex,
name: $name,
unit_arms: $u,
tagged_arms: $t,
cur_rename: ($renamed),
has_tagged: ($($h)*),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
unit_arms: $u:tt,
tagged_arms: $t:tt,
cur_rename: ($($rename:tt)?),
has_tagged: ($($h:tt)*),
input: ( #[$_other:meta] $($rest:tt)* )
) => {
$crate::__from_json_enum_walk!(
lex: $lex,
name: $name,
unit_arms: $u,
tagged_arms: $t,
cur_rename: ($($rename)?),
has_tagged: ($($h)*),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
unit_arms: { $($u:tt)* },
tagged_arms: $t:tt,
cur_rename: ($($rename:tt)?),
has_tagged: ($($h:tt)*),
input: ( $vname:ident , $($rest:tt)* )
) => {
$crate::__from_json_enum_walk!(
lex: $lex,
name: $name,
unit_arms: {
$($u)*
$crate::__from_json_field_key!($vname, ($($rename)?))
=> ::core::result::Result::Ok($name::$vname),
},
tagged_arms: $t,
cur_rename: (),
has_tagged: ($($h)*),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
unit_arms: { $($u:tt)* },
tagged_arms: $t:tt,
cur_rename: ($($rename:tt)?),
has_tagged: ($($h:tt)*),
input: ( $vname:ident )
) => {
$crate::__from_json_enum_walk!(
lex: $lex,
name: $name,
unit_arms: {
$($u)*
$crate::__from_json_field_key!($vname, ($($rename)?))
=> ::core::result::Result::Ok($name::$vname),
},
tagged_arms: $t,
cur_rename: (),
has_tagged: ($($h)*),
input: ()
)
};
(
lex: $lex:ident,
name: $name:ident,
unit_arms: $u:tt,
tagged_arms: { $($t:tt)* },
cur_rename: ($($rename:tt)?),
has_tagged: ($($h:tt)*),
input: ( $vname:ident ( $fty:ty $(,)? ) , $($rest:tt)* )
) => {
$crate::__from_json_enum_walk!(
lex: $lex,
name: $name,
unit_arms: $u,
tagged_arms: {
$($t)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => $name::$vname(
<$fty as $crate::FromJson<'_>>::from_lex($lex)?,
),
},
cur_rename: (),
has_tagged: ($($h)* ()),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
unit_arms: $u:tt,
tagged_arms: { $($t:tt)* },
cur_rename: ($($rename:tt)?),
has_tagged: ($($h:tt)*),
input: ( $vname:ident ( $fty:ty $(,)? ) )
) => {
$crate::__from_json_enum_walk!(
lex: $lex,
name: $name,
unit_arms: $u,
tagged_arms: {
$($t)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => $name::$vname(
<$fty as $crate::FromJson<'_>>::from_lex($lex)?,
),
},
cur_rename: (),
has_tagged: ($($h)* ()),
input: ()
)
};
(
lex: $lex:ident,
name: $name:ident,
unit_arms: $u:tt,
tagged_arms: { $($t:tt)* },
cur_rename: ($($rename:tt)?),
has_tagged: ($($h:tt)*),
input: ( $vname:ident ( $fty1:ty, $($ftyn:ty),+ $(,)? ) , $($rest:tt)* )
) => {
$crate::__from_json_enum_walk!(
lex: $lex,
name: $name,
unit_arms: $u,
tagged_arms: {
$($t)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => {
if $lex.array_start()? {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, $lex.position()),
);
}
let __elem_0 = <$fty1 as $crate::FromJson<'_>>::from_lex($lex)?;
$crate::__from_json_tuple_walk!(
lex: $lex,
self_ctor: ($name::$vname),
accum: [ __elem_0 ],
remaining: [ $(($ftyn))+ ]
)?
},
},
cur_rename: (),
has_tagged: ($($h)* ()),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
unit_arms: $u:tt,
tagged_arms: { $($t:tt)* },
cur_rename: ($($rename:tt)?),
has_tagged: ($($h:tt)*),
input: ( $vname:ident ( $fty1:ty, $($ftyn:ty),+ $(,)? ) )
) => {
$crate::__from_json_enum_walk!(
lex: $lex,
name: $name,
unit_arms: $u,
tagged_arms: {
$($t)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => {
if $lex.array_start()? {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, $lex.position()),
);
}
let __elem_0 = <$fty1 as $crate::FromJson<'_>>::from_lex($lex)?;
$crate::__from_json_tuple_walk!(
lex: $lex,
self_ctor: ($name::$vname),
accum: [ __elem_0 ],
remaining: [ $(($ftyn))+ ]
)?
},
},
cur_rename: (),
has_tagged: ($($h)* ()),
input: ()
)
};
(
lex: $lex:ident,
name: $name:ident,
unit_arms: $u:tt,
tagged_arms: { $($t:tt)* },
cur_rename: ($($rename:tt)?),
has_tagged: ($($h:tt)*),
input: ( $vname:ident { $($body:tt)* } , $($rest:tt)* )
) => {
$crate::__from_json_enum_walk!(
lex: $lex,
name: $name,
unit_arms: $u,
tagged_arms: {
$($t)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => {
$crate::__from_json_named_body!(
$lex,
($name::$vname),
strict,
$($body)*
)?
},
},
cur_rename: (),
has_tagged: ($($h)* ()),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
unit_arms: $u:tt,
tagged_arms: { $($t:tt)* },
cur_rename: ($($rename:tt)?),
has_tagged: ($($h:tt)*),
input: ( $vname:ident { $($body:tt)* } )
) => {
$crate::__from_json_enum_walk!(
lex: $lex,
name: $name,
unit_arms: $u,
tagged_arms: {
$($t)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => {
$crate::__from_json_named_body!(
$lex,
($name::$vname),
strict,
$($body)*
)?
},
},
cur_rename: (),
has_tagged: ($($h)* ()),
input: ()
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_internally_tagged_dispatch {
($lex:ident, $name:ident, $tag:literal, ($($variants:tt)*)) => {{
let __cp = $lex.checkpoint();
$lex.object_start()?;
let mut __maybe_key = $lex.object_first_key_lex()?;
let __tag_value: &str = loop {
let Some(__key_js) = __maybe_key else {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::MissingField, $lex.position()),
);
};
let __key_cow = $crate::key_to_cow(__key_js, $lex)?;
if __key_cow.as_ref() == $tag {
break $lex.parse_str_value()?;
}
$lex.skip_value()?;
__maybe_key = $lex.object_next_key_lex()?;
};
$lex.restore(__cp);
$crate::__from_json_internally_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
tag_value: (__tag_value),
unit_arms: { },
struct_arms: { },
cur_rename: (),
input: ($($variants)*)
)
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_internally_tagged_walk {
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
tag_value: ($tagval:ident),
unit_arms: { $($u:tt)* },
struct_arms: { $($s:tt)* },
cur_rename: (),
input: ()
) => {
match $tagval {
$($u)*
$($s)*
_ => ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::UnknownField, $lex.position()),
),
}
};
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
tag_value: ($tagval:ident),
unit_arms: $u:tt,
struct_arms: $s:tt,
cur_rename: (),
input: ( #[bourne(rename = $renamed:literal)] $($rest:tt)* )
) => {
$crate::__from_json_internally_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
tag_value: ($tagval),
unit_arms: $u,
struct_arms: $s,
cur_rename: ($renamed),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
tag_value: ($tagval:ident),
unit_arms: $u:tt,
struct_arms: $s:tt,
cur_rename: ($($rename:tt)?),
input: ( #[$_other:meta] $($rest:tt)* )
) => {
$crate::__from_json_internally_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
tag_value: ($tagval),
unit_arms: $u,
struct_arms: $s,
cur_rename: ($($rename)?),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
tag_value: ($tagval:ident),
unit_arms: $u:tt,
struct_arms: $s:tt,
cur_rename: ($($rename:tt)?),
input: ( $vname:ident ( $($_body:tt)* ) $($rest:tt)* )
) => {
::core::compile_error!(
"from_json! macro: internally-tagged enums (#[bourne(tag = \"...\")]) \
do not support newtype or tuple variants. Only unit and struct variants \
are allowed; the tag must be a sibling field of the variant's own \
fields, which is not representable for a non-object payload."
);
};
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
tag_value: ($tagval:ident),
unit_arms: { $($u:tt)* },
struct_arms: $s:tt,
cur_rename: ($($rename:tt)?),
input: ( $vname:ident , $($rest:tt)* )
) => {
$crate::__from_json_internally_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
tag_value: ($tagval),
unit_arms: {
$($u)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => {
$crate::__from_json_internally_tagged_unit_body!($lex, $tag);
::core::result::Result::Ok($name::$vname)
},
},
struct_arms: $s,
cur_rename: (),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
tag_value: ($tagval:ident),
unit_arms: { $($u:tt)* },
struct_arms: $s:tt,
cur_rename: ($($rename:tt)?),
input: ( $vname:ident )
) => {
$crate::__from_json_internally_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
tag_value: ($tagval),
unit_arms: {
$($u)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => {
$crate::__from_json_internally_tagged_unit_body!($lex, $tag);
::core::result::Result::Ok($name::$vname)
},
},
struct_arms: $s,
cur_rename: (),
input: ()
)
};
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
tag_value: ($tagval:ident),
unit_arms: $u:tt,
struct_arms: { $($s:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident { $($body:tt)* } , $($rest:tt)* )
) => {
$crate::__from_json_internally_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
tag_value: ($tagval),
unit_arms: $u,
struct_arms: {
$($s)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => {
$crate::__from_json_named_body_skip_one!(
$lex,
($name::$vname),
$tag,
$($body)*
)
},
},
cur_rename: (),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
tag_value: ($tagval:ident),
unit_arms: $u:tt,
struct_arms: { $($s:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident { $($body:tt)* } )
) => {
$crate::__from_json_internally_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
tag_value: ($tagval),
unit_arms: $u,
struct_arms: {
$($s)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => {
$crate::__from_json_named_body_skip_one!(
$lex,
($name::$vname),
$tag,
$($body)*
)
},
},
cur_rename: (),
input: ()
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_named_body_skip_one {
($lex:ident, ($($self_ctor:tt)+), $skip_key:literal, $($body:tt)*) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: (tag_skip $skip_key),
decls: { },
arms: { },
assigns: { },
ftokens: [],
cur_name: (),
cur_rename: (),
cur_default: (),
input: ($($body)*)
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_internally_tagged_unit_body {
($lex:ident, $tag:literal) => {{
$lex.object_start()?;
let mut __maybe_key = $lex.object_first_key_lex()?;
while let ::core::option::Option::Some(__key_js) = __maybe_key {
let __key_cow = $crate::key_to_cow(__key_js, $lex)?;
if __key_cow.as_ref() == $tag {
$lex.skip_value()?;
} else {
return ::core::result::Result::Err($crate::Error::new(
$crate::ErrorKind::UnknownField,
$lex.position(),
));
}
__maybe_key = $lex.object_next_key_lex()?;
}
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_adjacently_tagged_dispatch {
($lex:ident, $name:ident, $tag:literal, $content:literal, ($($variants:tt)*)) => {{
$lex.object_start()?;
let mut __tag_value: ::core::option::Option<&str> = ::core::option::Option::None;
let mut __content_cp: ::core::option::Option<$crate::Checkpoint> =
::core::option::Option::None;
let mut __maybe_key = $lex.object_first_key_lex()?;
while let ::core::option::Option::Some(__key_js) = __maybe_key {
let __key_cow = $crate::key_to_cow(__key_js, $lex)?;
if __key_cow.as_ref() == $tag {
if __tag_value.is_some() {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::DuplicateKey, $lex.position()),
);
}
__tag_value = ::core::option::Option::Some($lex.parse_str_value()?);
} else if __key_cow.as_ref() == $content {
if __content_cp.is_some() {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::DuplicateKey, $lex.position()),
);
}
__content_cp = ::core::option::Option::Some($lex.checkpoint());
$lex.skip_value()?;
} else {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::UnknownField, $lex.position()),
);
}
__maybe_key = $lex.object_next_key_lex()?;
}
let __tag = __tag_value.ok_or_else(|| {
$crate::Error::new($crate::ErrorKind::MissingField, $lex.position())
})?;
let __post_cp = $lex.checkpoint();
let __value = $crate::__from_json_adjacently_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
content_key: $content,
tag_value: (__tag),
content_cp: (__content_cp),
arms: { },
cur_rename: (),
input: ($($variants)*)
)?;
$lex.restore(__post_cp);
::core::result::Result::Ok(__value)
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_adjacently_tagged_walk {
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
content_key: $content:literal,
tag_value: ($tagval:ident),
content_cp: ($cp:ident),
arms: { $($a:tt)* },
cur_rename: (),
input: ()
) => {
match $tagval {
$($a)*
_ => ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::UnknownField, $lex.position()),
),
}
};
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
content_key: $content:literal,
tag_value: ($tagval:ident),
content_cp: ($cp:ident),
arms: $a:tt,
cur_rename: (),
input: ( #[bourne(rename = $renamed:literal)] $($rest:tt)* )
) => {
$crate::__from_json_adjacently_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
content_key: $content,
tag_value: ($tagval),
content_cp: ($cp),
arms: $a,
cur_rename: ($renamed),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
content_key: $content:literal,
tag_value: ($tagval:ident),
content_cp: ($cp:ident),
arms: $a:tt,
cur_rename: ($($rename:tt)?),
input: ( #[$_other:meta] $($rest:tt)* )
) => {
$crate::__from_json_adjacently_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
content_key: $content,
tag_value: ($tagval),
content_cp: ($cp),
arms: $a,
cur_rename: ($($rename)?),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
content_key: $content:literal,
tag_value: ($tagval:ident),
content_cp: ($cp:ident),
arms: { $($a:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident $(, $($rest:tt)*)? )
) => {
$crate::__from_json_adjacently_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
content_key: $content,
tag_value: ($tagval),
content_cp: ($cp),
arms: {
$($a)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => {
if $cp.is_some() {
::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::UnknownField, $lex.position()),
)
} else {
::core::result::Result::Ok($name::$vname)
}
},
},
cur_rename: (),
input: ($($($rest)*)?)
)
};
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
content_key: $content:literal,
tag_value: ($tagval:ident),
content_cp: ($cp:ident),
arms: { $($a:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident ( $fty:ty $(,)? ) $(, $($rest:tt)*)? )
) => {
$crate::__from_json_adjacently_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
content_key: $content,
tag_value: ($tagval),
content_cp: ($cp),
arms: {
$($a)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => {
match $cp {
::core::option::Option::Some(__c) => {
$lex.restore(__c);
::core::result::Result::Ok($name::$vname(
<$fty as $crate::FromJson<'_>>::from_lex($lex)?,
))
}
::core::option::Option::None => ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::MissingField, $lex.position()),
),
}
},
},
cur_rename: (),
input: ($($($rest)*)?)
)
};
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
content_key: $content:literal,
tag_value: ($tagval:ident),
content_cp: ($cp:ident),
arms: { $($a:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident ( $fty1:ty, $($ftyn:ty),+ $(,)? ) $(, $($rest:tt)*)? )
) => {
$crate::__from_json_adjacently_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
content_key: $content,
tag_value: ($tagval),
content_cp: ($cp),
arms: {
$($a)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => {
match $cp {
::core::option::Option::Some(__c) => {
$lex.restore(__c);
if $lex.array_start()? {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, $lex.position()),
);
}
let __elem_0 = <$fty1 as $crate::FromJson<'_>>::from_lex($lex)?;
$crate::__from_json_tuple_walk!(
lex: $lex,
self_ctor: ($name::$vname),
accum: [ __elem_0 ],
remaining: [ $(($ftyn))+ ]
)
}
::core::option::Option::None => ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::MissingField, $lex.position()),
),
}
},
},
cur_rename: (),
input: ($($($rest)*)?)
)
};
(
lex: $lex:ident,
name: $name:ident,
tag_key: $tag:literal,
content_key: $content:literal,
tag_value: ($tagval:ident),
content_cp: ($cp:ident),
arms: { $($a:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident { $($body:tt)* } $(, $($rest:tt)*)? )
) => {
$crate::__from_json_adjacently_tagged_walk!(
lex: $lex,
name: $name,
tag_key: $tag,
content_key: $content,
tag_value: ($tagval),
content_cp: ($cp),
arms: {
$($a)*
$crate::__from_json_field_key!($vname, ($($rename)?)) => {
match $cp {
::core::option::Option::Some(__c) => {
$lex.restore(__c);
$crate::__from_json_named_body!(
$lex,
($name::$vname),
strict,
$($body)*
)
}
::core::option::Option::None => ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::MissingField, $lex.position()),
),
}
},
},
cur_rename: (),
input: ($($($rest)*)?)
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_untagged_dispatch {
($lex:ident, $name:ident, ($($variants:tt)*)) => {{
let __cp = $lex.checkpoint();
$crate::__from_json_untagged_walk!(
lex: $lex,
name: $name,
cp: (__cp),
cur_rename: (),
input: ($($variants)*)
)
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_untagged_walk {
(
lex: $lex:ident,
name: $name:ident,
cp: ($cp:ident),
cur_rename: (),
input: ()
) => {
::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, $lex.position()),
)
};
(
lex: $lex:ident,
name: $name:ident,
cp: ($cp:ident),
cur_rename: (),
input: ( #[bourne(rename = $_renamed:literal)] $($rest:tt)* )
) => {
$crate::__from_json_untagged_walk!(
lex: $lex,
name: $name,
cp: ($cp),
cur_rename: (),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
cp: ($cp:ident),
cur_rename: (),
input: ( #[$_other:meta] $($rest:tt)* )
) => {
$crate::__from_json_untagged_walk!(
lex: $lex,
name: $name,
cp: ($cp),
cur_rename: (),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
name: $name:ident,
cp: ($cp:ident),
cur_rename: (),
input: ( $vname:ident $(, $($rest:tt)*)? )
) => {{
$lex.restore($cp);
let __try: ::core::result::Result<$name, $crate::Error> = (|| {
<() as $crate::FromJson<'_>>::from_lex($lex)?;
::core::result::Result::Ok($name::$vname)
})();
if let ::core::result::Result::Ok(__v) = __try {
::core::result::Result::Ok(__v)
} else {
$crate::__from_json_untagged_walk!(
lex: $lex,
name: $name,
cp: ($cp),
cur_rename: (),
input: ($($($rest)*)?)
)
}
}};
(
lex: $lex:ident,
name: $name:ident,
cp: ($cp:ident),
cur_rename: (),
input: ( $vname:ident ( $fty:ty $(,)? ) $(, $($rest:tt)*)? )
) => {{
$lex.restore($cp);
let __try: ::core::result::Result<$name, $crate::Error> = (|| {
::core::result::Result::Ok($name::$vname(
<$fty as $crate::FromJson<'_>>::from_lex($lex)?,
))
})();
if let ::core::result::Result::Ok(__v) = __try {
::core::result::Result::Ok(__v)
} else {
$crate::__from_json_untagged_walk!(
lex: $lex,
name: $name,
cp: ($cp),
cur_rename: (),
input: ($($($rest)*)?)
)
}
}};
(
lex: $lex:ident,
name: $name:ident,
cp: ($cp:ident),
cur_rename: (),
input: ( $vname:ident ( $fty1:ty, $($ftyn:ty),+ $(,)? ) $(, $($rest:tt)*)? )
) => {{
$lex.restore($cp);
let __try: ::core::result::Result<$name, $crate::Error> = (|| {
if $lex.array_start()? {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, $lex.position()),
);
}
let __elem_0 = <$fty1 as $crate::FromJson<'_>>::from_lex($lex)?;
$crate::__from_json_tuple_walk!(
lex: $lex,
self_ctor: ($name::$vname),
accum: [ __elem_0 ],
remaining: [ $(($ftyn))+ ]
)
})();
if let ::core::result::Result::Ok(__v) = __try {
::core::result::Result::Ok(__v)
} else {
$crate::__from_json_untagged_walk!(
lex: $lex,
name: $name,
cp: ($cp),
cur_rename: (),
input: ($($($rest)*)?)
)
}
}};
(
lex: $lex:ident,
name: $name:ident,
cp: ($cp:ident),
cur_rename: (),
input: ( $vname:ident { $($body:tt)* } $(, $($rest:tt)*)? )
) => {{
$lex.restore($cp);
let __try: ::core::result::Result<$name, $crate::Error> = (|| {
$crate::__from_json_named_body!(
$lex,
($name::$vname),
strict,
$($body)*
)
})();
if let ::core::result::Result::Ok(__v) = __try {
::core::result::Result::Ok(__v)
} else {
$crate::__from_json_untagged_walk!(
lex: $lex,
name: $name,
cp: ($cp),
cur_rename: (),
input: ($($($rest)*)?)
)
}
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_tuple_walk {
(
lex: $lex:ident,
self_ctor: ($($ctor:tt)+),
accum: [ $($prev:ident),+ ],
remaining: []
) => {{
if !$lex.array_continue(b']')? {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, $lex.position()),
);
}
::core::result::Result::Ok($($ctor)+($($prev),+))
}};
(lex: $lex:ident, self_ctor: ($($ctor:tt)+), accum: [ $a:ident ], remaining: [ ($fty:ty) $($rest:tt)* ]) => {{
if $lex.array_continue(b']')? {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, $lex.position()),
);
}
let __elem_1 = <$fty as $crate::FromJson<'_>>::from_lex($lex)?;
$crate::__from_json_tuple_walk!(
lex: $lex, self_ctor: ($($ctor)+), accum: [ $a, __elem_1 ], remaining: [ $($rest)* ]
)
}};
(lex: $lex:ident, self_ctor: ($($ctor:tt)+), accum: [ $a:ident, $b:ident ], remaining: [ ($fty:ty) $($rest:tt)* ]) => {{
if $lex.array_continue(b']')? {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, $lex.position()),
);
}
let __elem_2 = <$fty as $crate::FromJson<'_>>::from_lex($lex)?;
$crate::__from_json_tuple_walk!(
lex: $lex, self_ctor: ($($ctor)+), accum: [ $a, $b, __elem_2 ], remaining: [ $($rest)* ]
)
}};
(lex: $lex:ident, self_ctor: ($($ctor:tt)+), accum: [ $a:ident, $b:ident, $c:ident ], remaining: [ ($fty:ty) $($rest:tt)* ]) => {{
if $lex.array_continue(b']')? {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, $lex.position()),
);
}
let __elem_3 = <$fty as $crate::FromJson<'_>>::from_lex($lex)?;
$crate::__from_json_tuple_walk!(
lex: $lex, self_ctor: ($($ctor)+), accum: [ $a, $b, $c, __elem_3 ], remaining: [ $($rest)* ]
)
}};
(lex: $lex:ident, self_ctor: ($($ctor:tt)+), accum: [ $a:ident, $b:ident, $c:ident, $d:ident ], remaining: [ ($fty:ty) $($rest:tt)* ]) => {{
if $lex.array_continue(b']')? {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, $lex.position()),
);
}
let __elem_4 = <$fty as $crate::FromJson<'_>>::from_lex($lex)?;
$crate::__from_json_tuple_walk!(
lex: $lex, self_ctor: ($($ctor)+), accum: [ $a, $b, $c, $d, __elem_4 ], remaining: [ $($rest)* ]
)
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_named_body {
($lex:ident, ($($self_ctor:tt)+), strict, $($body:tt)*) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: strict,
decls: { },
arms: { },
assigns: { },
ftokens: [],
cur_name: (),
cur_rename: (),
cur_default: (),
input: ($($body)*)
)
};
($lex:ident, ($($self_ctor:tt)+), lenient, $($body:tt)*) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: lenient,
decls: { },
arms: { },
assigns: { },
ftokens: [],
cur_name: (),
cur_rename: (),
cur_default: (),
input: ($($body)*)
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_walk {
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: { $($decls:tt)* },
arms: { $($arms:tt)* },
assigns: { $($assigns:tt)* },
ftokens: [],
cur_name: (),
cur_rename: (),
cur_default: (),
input: ()
) => {{
$lex.object_start()?;
$($decls)*
let mut __maybe_key = $lex.object_first_key_lex()?;
while let ::core::option::Option::Some(__key_js) = __maybe_key {
let __key_cow = $crate::key_to_cow(__key_js, $lex)?;
match __key_cow.as_ref() {
$($arms)*
_ => {
$crate::__from_json_unknown_arm!($u, $lex, __key_cow);
}
}
__maybe_key = $lex.object_next_key_lex()?;
}
::core::result::Result::Ok($($self_ctor)+ { $($assigns)* })
}};
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: { $($decls:tt)* },
arms: { $($arms:tt)* },
assigns: { $($assigns:tt)* },
ftokens: [ $($fty:tt)+ ],
cur_name: ($fname:ident),
cur_rename: ($($rename:tt)?),
cur_default: (skip),
input: ()
) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: $u,
decls: { $($decls)* },
arms: { $($arms)* },
assigns: {
$($assigns)*
$fname: <$($fty)+ as ::core::default::Default>::default(),
},
ftokens: [],
cur_name: (),
cur_rename: (),
cur_default: (),
input: ()
)
};
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: { $($decls:tt)* },
arms: { $($arms:tt)* },
assigns: { $($assigns:tt)* },
ftokens: [ $($fty:tt)+ ],
cur_name: ($fname:ident),
cur_rename: ($($rename:tt)?),
cur_default: ($($default:tt)?),
input: ()
) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: $u,
decls: {
$($decls)*
let mut $fname: ::core::option::Option<$($fty)+> = ::core::option::Option::None;
},
arms: {
$($arms)*
$crate::__from_json_field_key!($fname, ($($rename)?)) => {
if $fname.is_some() {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::DuplicateKey, $lex.position()),
);
}
$fname = ::core::option::Option::Some(
$crate::__from_json_acquire!($lex, $($fty)+)
);
}
},
assigns: {
$($assigns)*
$fname: $crate::__from_json_finalize_with_default!(
$lex, $fname, ($($default)?), $($fty)+
),
},
ftokens: [],
cur_name: (),
cur_rename: (),
cur_default: (),
input: ()
)
};
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: $decls:tt,
arms: $arms:tt,
assigns: $assigns:tt,
ftokens: [],
cur_name: (),
cur_rename: (),
cur_default: ($($default:tt)?),
input: ( #[bourne(rename = $renamed:literal)] $($rest:tt)* )
) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: $u,
decls: $decls,
arms: $arms,
assigns: $assigns,
ftokens: [],
cur_name: (),
cur_rename: ($renamed),
cur_default: ($($default)?),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: $decls:tt,
arms: $arms:tt,
assigns: $assigns:tt,
ftokens: [],
cur_name: (),
cur_rename: ($($rename:tt)?),
cur_default: (),
input: ( #[bourne(skip)] $($rest:tt)* )
) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: $u,
decls: $decls,
arms: $arms,
assigns: $assigns,
ftokens: [],
cur_name: (),
cur_rename: ($($rename)?),
cur_default: (skip),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: $decls:tt,
arms: $arms:tt,
assigns: $assigns:tt,
ftokens: [],
cur_name: (),
cur_rename: ($($rename:tt)?),
cur_default: (),
input: ( #[bourne(default)] $($rest:tt)* )
) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: $u,
decls: $decls,
arms: $arms,
assigns: $assigns,
ftokens: [],
cur_name: (),
cur_rename: ($($rename)?),
cur_default: (trait_default),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: $decls:tt,
arms: $arms:tt,
assigns: $assigns:tt,
ftokens: [],
cur_name: (),
cur_rename: ($($rename:tt)?),
cur_default: ($($default:tt)?),
input: ( #[bourne(skip_if_none)] $($rest:tt)* )
) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: $u,
decls: $decls,
arms: $arms,
assigns: $assigns,
ftokens: [],
cur_name: (),
cur_rename: ($($rename)?),
cur_default: ($($default)?),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: $decls:tt,
arms: $arms:tt,
assigns: $assigns:tt,
ftokens: [],
cur_name: (),
cur_rename: (),
cur_default: (),
input: ( #[bourne(rename = $renamed:literal, default)] $($rest:tt)* )
) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: $u,
decls: $decls,
arms: $arms,
assigns: $assigns,
ftokens: [],
cur_name: (),
cur_rename: ($renamed),
cur_default: (trait_default),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: $decls:tt,
arms: $arms:tt,
assigns: $assigns:tt,
ftokens: [],
cur_name: (),
cur_rename: ($($rename:tt)?),
cur_default: (),
input: ( #[bourne(default = $_path:literal)] $($rest:tt)* )
) => {
::core::compile_error!(
"from_json! macro: `#[bourne(default = \"path\")]` is not supported. \
Use bare `#[bourne(default)]` (which calls Default::default()) and implement Default \
for the field type, or hand-write the FromJson impl. macro_rules! cannot resolve a \
string literal to a function path."
);
};
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: $decls:tt,
arms: $arms:tt,
assigns: $assigns:tt,
ftokens: [],
cur_name: (),
cur_rename: ($($rename:tt)?),
cur_default: ($($default:tt)?),
input: ( #[$_other:meta] $($rest:tt)* )
) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: $u,
decls: $decls,
arms: $arms,
assigns: $assigns,
ftokens: [],
cur_name: (),
cur_rename: ($($rename)?),
cur_default: ($($default)?),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: $decls:tt,
arms: $arms:tt,
assigns: $assigns:tt,
ftokens: [],
cur_name: (),
cur_rename: ($($rename:tt)?),
cur_default: ($($default:tt)?),
input: ($_fvis:vis $fname:ident : $($rest:tt)*)
) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: $u,
decls: $decls,
arms: $arms,
assigns: $assigns,
ftokens: [],
cur_name: ($fname),
cur_rename: ($($rename)?),
cur_default: ($($default)?),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: { $($decls:tt)* },
arms: { $($arms:tt)* },
assigns: { $($assigns:tt)* },
ftokens: [ $($fty:tt)+ ],
cur_name: ($fname:ident),
cur_rename: ($($rename:tt)?),
cur_default: (skip),
input: ( , $($rest:tt)* )
) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: $u,
decls: { $($decls)* },
arms: { $($arms)* },
assigns: {
$($assigns)*
$fname: <$($fty)+ as ::core::default::Default>::default(),
},
ftokens: [],
cur_name: (),
cur_rename: (),
cur_default: (),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: { $($decls:tt)* },
arms: { $($arms:tt)* },
assigns: { $($assigns:tt)* },
ftokens: [ $($fty:tt)+ ],
cur_name: ($fname:ident),
cur_rename: ($($rename:tt)?),
cur_default: ($($default:tt)?),
input: ( , $($rest:tt)* )
) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: $u,
decls: {
$($decls)*
let mut $fname: ::core::option::Option<$($fty)+> = ::core::option::Option::None;
},
arms: {
$($arms)*
$crate::__from_json_field_key!($fname, ($($rename)?)) => {
if $fname.is_some() {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::DuplicateKey, $lex.position()),
);
}
$fname = ::core::option::Option::Some(
$crate::__from_json_acquire!($lex, $($fty)+)
);
}
},
assigns: {
$($assigns)*
$fname: $crate::__from_json_finalize_with_default!(
$lex, $fname, ($($default)?), $($fty)+
),
},
ftokens: [],
cur_name: (),
cur_rename: (),
cur_default: (),
input: ($($rest)*)
)
};
(
lex: $lex:ident,
ctor: ($($self_ctor:tt)+),
unknown: $u:tt,
decls: $decls:tt,
arms: $arms:tt,
assigns: $assigns:tt,
ftokens: [ $($fty:tt)* ],
cur_name: ($fname:ident),
cur_rename: ($($rename:tt)?),
cur_default: ($($default:tt)?),
input: ( $head:tt $($rest:tt)* )
) => {
$crate::__from_json_walk!(
lex: $lex,
ctor: ($($self_ctor)+),
unknown: $u,
decls: $decls,
arms: $arms,
assigns: $assigns,
ftokens: [ $($fty)* $head ],
cur_name: ($fname),
cur_rename: ($($rename)?),
cur_default: ($($default)?),
input: ($($rest)*)
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_unknown_arm {
(strict, $lex:ident, $key:ident) => {
return ::core::result::Result::Err($crate::Error::new(
$crate::ErrorKind::UnknownField,
$lex.position(),
));
};
(lenient, $lex:ident, $key:ident) => {
$lex.skip_value()?;
};
((tag_skip $skip_key:literal), $lex:ident, $key:ident) => {
if $key.as_ref() == $skip_key {
$lex.skip_value()?;
} else {
return ::core::result::Result::Err($crate::Error::new(
$crate::ErrorKind::UnknownField,
$lex.position(),
));
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_field_key {
($fname:ident, ($renamed:literal)) => {
$renamed
};
($fname:ident, ()) => {
::core::stringify!($fname)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_finalize_with_default {
($lex:ident, $fname:ident, (), $($fty:tt)+) => {
$crate::__from_json_finalize!($lex, $fname, $($fty)+)
};
($lex:ident, $fname:ident, (trait_default), $($fty:tt)+) => {
$fname.unwrap_or_else(|| <$($fty)+ as ::core::default::Default>::default())
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_acquire {
($lex:ident, & str) => { $lex.parse_str_value()? };
($lex:ident, & $lt:lifetime str) => { $lex.parse_str_value()? };
($lex:ident, i8) => {
<i8>::try_from($lex.parse_i64_value()?).map_err(|_| {
$crate::Error::new($crate::ErrorKind::NumberOutOfRange, $lex.position())
})?
};
($lex:ident, i16) => {
<i16>::try_from($lex.parse_i64_value()?).map_err(|_| {
$crate::Error::new($crate::ErrorKind::NumberOutOfRange, $lex.position())
})?
};
($lex:ident, i32) => {
<i32>::try_from($lex.parse_i64_value()?).map_err(|_| {
$crate::Error::new($crate::ErrorKind::NumberOutOfRange, $lex.position())
})?
};
($lex:ident, i64) => {
$lex.parse_i64_value()?
};
($lex:ident, isize) => {
<isize>::try_from($lex.parse_i64_value()?).map_err(|_| {
$crate::Error::new($crate::ErrorKind::NumberOutOfRange, $lex.position())
})?
};
($lex:ident, u8) => {
<u8>::try_from($lex.parse_i64_value()?).map_err(|_| {
$crate::Error::new($crate::ErrorKind::NumberOutOfRange, $lex.position())
})?
};
($lex:ident, u16) => {
<u16>::try_from($lex.parse_i64_value()?).map_err(|_| {
$crate::Error::new($crate::ErrorKind::NumberOutOfRange, $lex.position())
})?
};
($lex:ident, u32) => {
<u32>::try_from($lex.parse_i64_value()?).map_err(|_| {
$crate::Error::new($crate::ErrorKind::NumberOutOfRange, $lex.position())
})?
};
($lex:ident, u64) => {
<u64>::try_from($lex.parse_i64_value()?).map_err(|_| {
$crate::Error::new($crate::ErrorKind::NumberOutOfRange, $lex.position())
})?
};
($lex:ident, usize) => {
<usize>::try_from($lex.parse_i64_value()?).map_err(|_| {
$crate::Error::new($crate::ErrorKind::NumberOutOfRange, $lex.position())
})?
};
($lex:ident, $($ty:tt)+) => {
<$($ty)+ as $crate::FromJson<'_>>::from_lex($lex)?
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_finalize {
($lex:ident, $fname:ident, Option < $($rest:tt)*) => {
$crate::__from_json_finalize_option!($lex, $fname)
};
($lex:ident, $fname:ident, $($fty:tt)+) => {
$crate::__from_json_finalize_required!($lex, $fname)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_finalize_option {
($lex:ident, $fname:ident) => {
$fname.unwrap_or(::core::option::Option::None)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __from_json_finalize_required {
($lex:ident, $fname:ident) => {
$fname
.ok_or_else(|| $crate::Error::new($crate::ErrorKind::MissingField, $lex.position()))?
};
}
#[macro_export]
macro_rules! to_json {
(
$(#[$attr:meta])*
$vis:vis struct $name:ident { $($body:tt)* }
) => {
$crate::__to_json_emit_struct_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
body: ($($body)*)
);
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
$crate::__to_json_named_body!(self, __w, $($body)*)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime $(,)? > { $($body:tt)* }
) => {
$crate::__to_json_emit_struct_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
body: ($($body)*)
);
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
$crate::__to_json_named_body!(self, __w, $($body)*)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident ( $fty:ty $(,)? ) ;
) => {
$(#[$attr])*
$vis struct $name($fty);
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
$crate::ToJson::write_json(&self.0, __w)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime $(,)? > ( $fty:ty $(,)? ) ;
) => {
$(#[$attr])*
$vis struct $name<$lt>($fty);
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
$crate::ToJson::write_json(&self.0, __w)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident ( $fty1:ty, $($ftyn:ty),+ $(,)? ) ;
) => {
$(#[$attr])*
$vis struct $name($fty1, $($ftyn),+);
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
__w.write_raw_bytes(b"[")?;
$crate::ToJson::write_json(&self.0, __w)?;
$crate::__to_json_tuple_walk!(
self_ref: self,
sink: __w,
idx: 1,
remaining: [ $(($ftyn))+ ]
);
__w.write_raw_bytes(b"]")?;
::core::result::Result::Ok(())
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime $(,)? > ( $fty1:ty, $($ftyn:ty),+ $(,)? ) ;
) => {
$(#[$attr])*
$vis struct $name<$lt>($fty1, $($ftyn),+);
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
__w.write_raw_bytes(b"[")?;
$crate::ToJson::write_json(&self.0, __w)?;
$crate::__to_json_tuple_walk!(
self_ref: self,
sink: __w,
idx: 1,
remaining: [ $(($ftyn))+ ]
);
__w.write_raw_bytes(b"]")?;
::core::result::Result::Ok(())
}
}
};
(
#[bourne(untagged)]
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
variants_input: ($($variants)*)
);
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_untagged_walk!(
receiver: __this,
sink: __w,
name: $name,
arms: { },
input: ($($variants)*)
)
}
}
};
(
#[bourne(untagged)]
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
variants_input: ($($variants)*)
);
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_untagged_walk!(
receiver: __this,
sink: __w,
name: $name,
arms: { },
input: ($($variants)*)
)
}
}
};
(
#[bourne(tag = $tag:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
variants_input: ($($variants)*)
);
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_internal_walk!(
receiver: __this,
sink: __w,
name: $name,
tag: $tag,
arms: { },
cur_rename: (),
input: ($($variants)*)
)
}
}
};
(
#[bourne(tag = $tag:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
variants_input: ($($variants)*)
);
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_internal_walk!(
receiver: __this,
sink: __w,
name: $name,
tag: $tag,
arms: { },
cur_rename: (),
input: ($($variants)*)
)
}
}
};
(
#[bourne(tag = $tag:literal, content = $content:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
variants_input: ($($variants)*)
);
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_adjacent_walk!(
receiver: __this,
sink: __w,
name: $name,
tag: $tag,
content: $content,
arms: { },
cur_rename: (),
input: ($($variants)*)
)
}
}
};
(
#[bourne(tag = $tag:literal, content = $content:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
variants_input: ($($variants)*)
);
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_adjacent_walk!(
receiver: __this,
sink: __w,
name: $name,
tag: $tag,
content: $content,
arms: { },
cur_rename: (),
input: ($($variants)*)
)
}
}
};
(
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
variants_input: ($($variants)*)
);
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_enum_walk!(
receiver: __this,
sink: __w,
name: $name,
arms: { },
cur_rename: (),
input: ($($variants)*)
)
}
}
};
(
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
variants_input: ($($variants)*)
);
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_enum_walk!(
receiver: __this,
sink: __w,
name: $name,
arms: { },
cur_rename: (),
input: ($($variants)*)
)
}
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __to_json_enum_walk {
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
cur_rename: (),
input: ()
) => {
match $r {
$($arms)*
}
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: $arms:tt,
cur_rename: (),
input: ( #[bourne(rename = $renamed:literal)] $($rest:tt)* )
) => {
$crate::__to_json_enum_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: $arms,
cur_rename: ($renamed),
input: ($($rest)*)
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: $arms:tt,
cur_rename: ($($rename:tt)?),
input: ( #[$_other:meta] $($rest:tt)* )
) => {
$crate::__to_json_enum_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: $arms,
cur_rename: ($($rename)?),
input: ($($rest)*)
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident , $($rest:tt)* )
) => {
$crate::__to_json_enum_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: {
$($arms)*
&$name::$vname => {
$w.write_raw_bytes(b"\"")?;
$w.write_str_raw($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b"\"")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ($($rest)*)
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident )
) => {
$crate::__to_json_enum_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: {
$($arms)*
&$name::$vname => {
$w.write_raw_bytes(b"\"")?;
$w.write_str_raw($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b"\"")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ()
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident ( $_fty:ty $(,)? ) $(, $($rest:tt)*)? )
) => {
$crate::__to_json_enum_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: {
$($arms)*
&$name::$vname(ref __inner) => {
$w.write_raw_bytes(b"{")?;
$w.write_escaped_str($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b":")?;
$crate::ToJson::write_json(__inner, $w)?;
$w.write_raw_bytes(b"}")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ( $($($rest)*)? )
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident ( $_a:ty, $_b:ty $(,)? ) $(, $($rest:tt)*)? )
) => {
$crate::__to_json_enum_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: {
$($arms)*
&$name::$vname(ref __a, ref __b) => {
$w.write_raw_bytes(b"{")?;
$w.write_escaped_str($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b":[")?;
$crate::ToJson::write_json(__a, $w)?;
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(__b, $w)?;
$w.write_raw_bytes(b"]}")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ( $($($rest)*)? )
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident ( $_a:ty, $_b:ty, $_c:ty $(,)? ) $(, $($rest:tt)*)? )
) => {
$crate::__to_json_enum_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: {
$($arms)*
&$name::$vname(ref __a, ref __b, ref __c) => {
$w.write_raw_bytes(b"{")?;
$w.write_escaped_str($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b":[")?;
$crate::ToJson::write_json(__a, $w)?;
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(__b, $w)?;
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(__c, $w)?;
$w.write_raw_bytes(b"]}")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ( $($($rest)*)? )
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident { $($fname:ident : $_fty:ty),+ $(,)? } $(, $($rest:tt)*)? )
) => {
$crate::__to_json_enum_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: {
$($arms)*
&$name::$vname { $(ref $fname),+ } => {
$w.write_raw_bytes(b"{")?;
$w.write_escaped_str($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b":{")?;
let mut __first: bool = true;
$(
if !__first { $w.write_raw_bytes(b",")?; }
$w.write_raw_bytes(
::core::concat!("\"", ::core::stringify!($fname), "\":").as_bytes()
)?;
$crate::ToJson::write_json($fname, $w)?;
__first = false;
)+
$w.write_raw_bytes(b"}}")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ( $($($rest)*)? )
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __to_json_internal_walk {
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
arms: { $($arms:tt)* },
cur_rename: (),
input: ()
) => {
match $r {
$($arms)*
}
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
arms: $arms:tt,
cur_rename: (),
input: ( #[bourne(rename = $renamed:literal)] $($rest:tt)* )
) => {
$crate::__to_json_internal_walk!(
receiver: $r,
sink: $w,
name: $name,
tag: $tag,
arms: $arms,
cur_rename: ($renamed),
input: ($($rest)*)
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
arms: $arms:tt,
cur_rename: ($($rename:tt)?),
input: ( #[$_other:meta] $($rest:tt)* )
) => {
$crate::__to_json_internal_walk!(
receiver: $r,
sink: $w,
name: $name,
tag: $tag,
arms: $arms,
cur_rename: ($($rename)?),
input: ($($rest)*)
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident , $($rest:tt)* )
) => {
$crate::__to_json_internal_walk!(
receiver: $r,
sink: $w,
name: $name,
tag: $tag,
arms: {
$($arms)*
&$name::$vname => {
$w.write_raw_bytes(b"{")?;
$w.write_escaped_str($tag)?;
$w.write_raw_bytes(b":\"")?;
$w.write_str_raw($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b"\"}")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ($($rest)*)
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident )
) => {
$crate::__to_json_internal_walk!(
receiver: $r,
sink: $w,
name: $name,
tag: $tag,
arms: {
$($arms)*
&$name::$vname => {
$w.write_raw_bytes(b"{")?;
$w.write_escaped_str($tag)?;
$w.write_raw_bytes(b":\"")?;
$w.write_str_raw($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b"\"}")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ()
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident { $($fname:ident : $_fty:ty),+ $(,)? } $(, $($rest:tt)*)? )
) => {
$crate::__to_json_internal_walk!(
receiver: $r,
sink: $w,
name: $name,
tag: $tag,
arms: {
$($arms)*
&$name::$vname { $(ref $fname),+ } => {
$w.write_raw_bytes(b"{")?;
$w.write_escaped_str($tag)?;
$w.write_raw_bytes(b":\"")?;
$w.write_str_raw($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b"\"")?;
$(
$w.write_raw_bytes(
::core::concat!(",\"", ::core::stringify!($fname), "\":").as_bytes()
)?;
$crate::ToJson::write_json($fname, $w)?;
)+
$w.write_raw_bytes(b"}")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ( $($($rest)*)? )
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __to_json_adjacent_walk {
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
content: $content:literal,
arms: { $($arms:tt)* },
cur_rename: (),
input: ()
) => {
match $r {
$($arms)*
}
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
content: $content:literal,
arms: $arms:tt,
cur_rename: (),
input: ( #[bourne(rename = $renamed:literal)] $($rest:tt)* )
) => {
$crate::__to_json_adjacent_walk!(
receiver: $r,
sink: $w,
name: $name,
tag: $tag,
content: $content,
arms: $arms,
cur_rename: ($renamed),
input: ($($rest)*)
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
content: $content:literal,
arms: $arms:tt,
cur_rename: ($($rename:tt)?),
input: ( #[$_other:meta] $($rest:tt)* )
) => {
$crate::__to_json_adjacent_walk!(
receiver: $r,
sink: $w,
name: $name,
tag: $tag,
content: $content,
arms: $arms,
cur_rename: ($($rename)?),
input: ($($rest)*)
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
content: $content:literal,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident , $($rest:tt)* )
) => {
$crate::__to_json_adjacent_walk!(
receiver: $r,
sink: $w,
name: $name,
tag: $tag,
content: $content,
arms: {
$($arms)*
&$name::$vname => {
$w.write_raw_bytes(b"{")?;
$w.write_escaped_str($tag)?;
$w.write_raw_bytes(b":\"")?;
$w.write_str_raw($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b"\"}")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ($($rest)*)
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
content: $content:literal,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident )
) => {
$crate::__to_json_adjacent_walk!(
receiver: $r,
sink: $w,
name: $name,
tag: $tag,
content: $content,
arms: {
$($arms)*
&$name::$vname => {
$w.write_raw_bytes(b"{")?;
$w.write_escaped_str($tag)?;
$w.write_raw_bytes(b":\"")?;
$w.write_str_raw($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b"\"}")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ()
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
content: $content:literal,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident ( $_fty:ty $(,)? ) $(, $($rest:tt)*)? )
) => {
$crate::__to_json_adjacent_walk!(
receiver: $r,
sink: $w,
name: $name,
tag: $tag,
content: $content,
arms: {
$($arms)*
&$name::$vname(ref __inner) => {
$w.write_raw_bytes(b"{")?;
$w.write_escaped_str($tag)?;
$w.write_raw_bytes(b":\"")?;
$w.write_str_raw($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b"\",")?;
$w.write_escaped_str($content)?;
$w.write_raw_bytes(b":")?;
$crate::ToJson::write_json(__inner, $w)?;
$w.write_raw_bytes(b"}")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ( $($($rest)*)? )
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
content: $content:literal,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident ( $_a:ty, $_b:ty $(,)? ) $(, $($rest:tt)*)? )
) => {
$crate::__to_json_adjacent_walk!(
receiver: $r,
sink: $w,
name: $name,
tag: $tag,
content: $content,
arms: {
$($arms)*
&$name::$vname(ref __a, ref __b) => {
$w.write_raw_bytes(b"{")?;
$w.write_escaped_str($tag)?;
$w.write_raw_bytes(b":\"")?;
$w.write_str_raw($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b"\",")?;
$w.write_escaped_str($content)?;
$w.write_raw_bytes(b":[")?;
$crate::ToJson::write_json(__a, $w)?;
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(__b, $w)?;
$w.write_raw_bytes(b"]}")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ( $($($rest)*)? )
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
content: $content:literal,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident ( $_a:ty, $_b:ty, $_c:ty $(,)? ) $(, $($rest:tt)*)? )
) => {
$crate::__to_json_adjacent_walk!(
receiver: $r,
sink: $w,
name: $name,
tag: $tag,
content: $content,
arms: {
$($arms)*
&$name::$vname(ref __a, ref __b, ref __c) => {
$w.write_raw_bytes(b"{")?;
$w.write_escaped_str($tag)?;
$w.write_raw_bytes(b":\"")?;
$w.write_str_raw($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b"\",")?;
$w.write_escaped_str($content)?;
$w.write_raw_bytes(b":[")?;
$crate::ToJson::write_json(__a, $w)?;
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(__b, $w)?;
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(__c, $w)?;
$w.write_raw_bytes(b"]}")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ( $($($rest)*)? )
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
tag: $tag:literal,
content: $content:literal,
arms: { $($arms:tt)* },
cur_rename: ($($rename:tt)?),
input: ( $vname:ident { $($fname:ident : $_fty:ty),+ $(,)? } $(, $($rest:tt)*)? )
) => {
$crate::__to_json_adjacent_walk!(
receiver: $r,
sink: $w,
name: $name,
tag: $tag,
content: $content,
arms: {
$($arms)*
&$name::$vname { $(ref $fname),+ } => {
$w.write_raw_bytes(b"{")?;
$w.write_escaped_str($tag)?;
$w.write_raw_bytes(b":\"")?;
$w.write_str_raw($crate::__to_json_field_key!($vname, ($($rename)?)))?;
$w.write_raw_bytes(b"\",")?;
$w.write_escaped_str($content)?;
$w.write_raw_bytes(b":{")?;
let mut __first: bool = true;
$(
if !__first { $w.write_raw_bytes(b",")?; }
$w.write_raw_bytes(
::core::concat!("\"", ::core::stringify!($fname), "\":").as_bytes()
)?;
$crate::ToJson::write_json($fname, $w)?;
__first = false;
)+
$w.write_raw_bytes(b"}}")?;
::core::result::Result::Ok(())
}
},
cur_rename: (),
input: ( $($($rest)*)? )
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __to_json_untagged_walk {
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
input: ()
) => {
match $r {
$($arms)*
}
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: $arms:tt,
input: ( #[$_other:meta] $($rest:tt)* )
) => {
$crate::__to_json_untagged_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: $arms,
input: ($($rest)*)
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
input: ( $vname:ident , $($rest:tt)* )
) => {
$crate::__to_json_untagged_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: {
$($arms)*
&$name::$vname => {
$w.write_raw_bytes(b"null")?;
::core::result::Result::Ok(())
}
},
input: ($($rest)*)
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
input: ( $vname:ident )
) => {
$crate::__to_json_untagged_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: {
$($arms)*
&$name::$vname => {
$w.write_raw_bytes(b"null")?;
::core::result::Result::Ok(())
}
},
input: ()
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
input: ( $vname:ident ( $_fty:ty $(,)? ) $(, $($rest:tt)*)? )
) => {
$crate::__to_json_untagged_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: {
$($arms)*
&$name::$vname(ref __inner) => {
$crate::ToJson::write_json(__inner, $w)?;
::core::result::Result::Ok(())
}
},
input: ( $($($rest)*)? )
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
input: ( $vname:ident ( $_a:ty, $_b:ty $(,)? ) $(, $($rest:tt)*)? )
) => {
$crate::__to_json_untagged_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: {
$($arms)*
&$name::$vname(ref __a, ref __b) => {
$w.write_raw_bytes(b"[")?;
$crate::ToJson::write_json(__a, $w)?;
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(__b, $w)?;
$w.write_raw_bytes(b"]")?;
::core::result::Result::Ok(())
}
},
input: ( $($($rest)*)? )
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
input: ( $vname:ident ( $_a:ty, $_b:ty, $_c:ty $(,)? ) $(, $($rest:tt)*)? )
) => {
$crate::__to_json_untagged_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: {
$($arms)*
&$name::$vname(ref __a, ref __b, ref __c) => {
$w.write_raw_bytes(b"[")?;
$crate::ToJson::write_json(__a, $w)?;
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(__b, $w)?;
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(__c, $w)?;
$w.write_raw_bytes(b"]")?;
::core::result::Result::Ok(())
}
},
input: ( $($($rest)*)? )
)
};
(
receiver: $r:ident,
sink: $w:ident,
name: $name:ident,
arms: { $($arms:tt)* },
input: ( $vname:ident { $($fname:ident : $_fty:ty),+ $(,)? } $(, $($rest:tt)*)? )
) => {
$crate::__to_json_untagged_walk!(
receiver: $r,
sink: $w,
name: $name,
arms: {
$($arms)*
&$name::$vname { $(ref $fname),+ } => {
$w.write_raw_bytes(b"{")?;
let mut __first: bool = true;
$(
if !__first { $w.write_raw_bytes(b",")?; }
$w.write_raw_bytes(
::core::concat!("\"", ::core::stringify!($fname), "\":").as_bytes()
)?;
$crate::ToJson::write_json($fname, $w)?;
__first = false;
)+
$w.write_raw_bytes(b"}")?;
::core::result::Result::Ok(())
}
},
input: ( $($($rest)*)? )
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __to_json_tuple_walk {
(
self_ref: $self:ident,
sink: $w:ident,
idx: $_idx:tt,
remaining: []
) => {};
(
self_ref: $self:ident,
sink: $w:ident,
idx: 1,
remaining: [ ($_fty:ty) ]
) => {
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(&$self.1, $w)?;
};
(
self_ref: $self:ident,
sink: $w:ident,
idx: 2,
remaining: [ ($_fty:ty) ]
) => {
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(&$self.2, $w)?;
};
(
self_ref: $self:ident,
sink: $w:ident,
idx: 3,
remaining: [ ($_fty:ty) ]
) => {
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(&$self.3, $w)?;
};
(
self_ref: $self:ident,
sink: $w:ident,
idx: 4,
remaining: [ ($_fty:ty) ]
) => {
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(&$self.4, $w)?;
};
(
self_ref: $self:ident,
sink: $w:ident,
idx: 5,
remaining: [ ($_fty:ty) ]
) => {
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(&$self.5, $w)?;
};
(
self_ref: $self:ident,
sink: $w:ident,
idx: 1,
remaining: [ ($_fty:ty) $(($rest:ty))+ ]
) => {
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(&$self.1, $w)?;
$crate::__to_json_tuple_walk!(
self_ref: $self,
sink: $w,
idx: 2,
remaining: [ $(($rest))+ ]
)
};
(
self_ref: $self:ident,
sink: $w:ident,
idx: 2,
remaining: [ ($_fty:ty) $(($rest:ty))+ ]
) => {
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(&$self.2, $w)?;
$crate::__to_json_tuple_walk!(
self_ref: $self,
sink: $w,
idx: 3,
remaining: [ $(($rest))+ ]
)
};
(
self_ref: $self:ident,
sink: $w:ident,
idx: 3,
remaining: [ ($_fty:ty) $(($rest:ty))+ ]
) => {
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(&$self.3, $w)?;
$crate::__to_json_tuple_walk!(
self_ref: $self,
sink: $w,
idx: 4,
remaining: [ $(($rest))+ ]
)
};
(
self_ref: $self:ident,
sink: $w:ident,
idx: 4,
remaining: [ ($_fty:ty) $(($rest:ty))+ ]
) => {
$w.write_raw_bytes(b",")?;
$crate::ToJson::write_json(&$self.4, $w)?;
$crate::__to_json_tuple_walk!(
self_ref: $self,
sink: $w,
idx: 5,
remaining: [ $(($rest))+ ]
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __to_json_emit_struct_def {
(
attrs: { $(#[$attr:meta])* },
vis: $vis:vis,
name: $name:ident,
generics_def: $gen:tt,
body: ($($body:tt)*)
) => {
$crate::__from_json_emit_struct_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: $gen,
body: ($($body)*)
);
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __to_json_named_body {
($self:ident, $w:ident, $($body:tt)*) => {{
$w.write_raw_bytes(b"{")?;
#[allow(unused_assignments, unused_mut, unused_variables)]
let mut __first: bool = true;
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: __first,
emit: { },
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: (yes),
input: ($($body)*)
);
$w.write_raw_bytes(b"}")?;
::core::result::Result::Ok(())
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __to_json_named_walk {
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: { $($emit:tt)* },
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: ($($_sf:tt)?),
input: ()
) => {
$($emit)*
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: { $($emit:tt)* },
cur_rename: ($($_rn:tt)?),
cur_skip: (skip),
cur_skip_if_none: ($($_si:tt)?),
cur_name: ($fname:ident),
ftokens: [ $($_ft:tt)+ ],
input: ()
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: { $($emit)* },
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: (no), input: ()
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: { $($emit:tt)* },
cur_rename: ($($rename:tt)?),
cur_skip: (),
cur_skip_if_none: (yes),
cur_name: ($fname:ident),
ftokens: [ $($_ft:tt)+ ],
input: ()
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: {
$($emit)*
if let ::core::option::Option::Some(ref __v) = $self.$fname {
if !$first { $w.write_raw_bytes(b",")?; }
$w.write_escaped_str(
$crate::__to_json_field_key!($fname, ($($rename)?))
)?;
$w.write_raw_bytes(b":")?;
$crate::ToJson::write_json(__v, $w)?;
$first = false;
}
},
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: (no),
input: ()
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: { $($emit:tt)* },
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: ($fname:ident),
ftokens: [ $($_ft:tt)+ ],
static_first: (yes),
input: ()
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: {
$($emit)*
$w.write_raw_bytes(
::core::concat!("\"", ::core::stringify!($fname), "\":").as_bytes()
)?;
$crate::ToJson::write_json(&$self.$fname, $w)?;
},
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: (no),
input: ()
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: { $($emit:tt)* },
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: ($fname:ident),
ftokens: [ $($_ft:tt)+ ],
static_first: (no),
input: ()
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: {
$($emit)*
$w.write_raw_bytes(
::core::concat!(",\"", ::core::stringify!($fname), "\":").as_bytes()
)?;
$crate::ToJson::write_json(&$self.$fname, $w)?;
},
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: (no),
input: ()
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: { $($emit:tt)* },
cur_rename: ($($rename:tt)?),
cur_skip: (),
cur_skip_if_none: (),
cur_name: ($fname:ident),
ftokens: [ $($_ft:tt)+ ],
static_first: ($($_sf:tt)?),
input: ()
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: {
$($emit)*
if !$first { $w.write_raw_bytes(b",")?; }
$w.write_escaped_str(
$crate::__to_json_field_key!($fname, ($($rename)?))
)?;
$w.write_raw_bytes(b":")?;
$crate::ToJson::write_json(&$self.$fname, $w)?;
$first = false;
},
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: (maybe),
input: ()
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: $emit:tt,
cur_rename: (),
cur_skip: ($($skip:tt)?),
cur_skip_if_none: ($($sin:tt)?),
cur_name: (),
ftokens: [],
static_first: ($($sf:tt)?),
input: ( #[bourne(rename = $renamed:literal)] $($rest:tt)* )
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: $emit,
cur_rename: ($renamed),
cur_skip: ($($skip)?),
cur_skip_if_none: ($($sin)?),
cur_name: (),
ftokens: [],
static_first: ($($sf)?),
input: ($($rest)*)
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: $emit:tt,
cur_rename: ($($rename:tt)?),
cur_skip: (),
cur_skip_if_none: ($($sin:tt)?),
cur_name: (),
ftokens: [],
static_first: ($($sf:tt)?),
input: ( #[bourne(skip)] $($rest:tt)* )
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: $emit,
cur_rename: ($($rename)?),
cur_skip: (skip),
cur_skip_if_none: ($($sin)?),
cur_name: (),
ftokens: [],
static_first: ($($sf)?),
input: ($($rest)*)
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: $emit:tt,
cur_rename: ($($rename:tt)?),
cur_skip: ($($skip:tt)?),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: ($($sf:tt)?),
input: ( #[bourne(skip_if_none)] $($rest:tt)* )
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: $emit,
cur_rename: ($($rename)?),
cur_skip: ($($skip)?),
cur_skip_if_none: (yes),
cur_name: (),
ftokens: [],
static_first: ($($sf)?),
input: ($($rest)*)
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: $emit:tt,
cur_rename: ($($rename:tt)?),
cur_skip: ($($skip:tt)?),
cur_skip_if_none: ($($sin:tt)?),
cur_name: (),
ftokens: [],
static_first: ($($sf:tt)?),
input: ( #[bourne(default)] $($rest:tt)* )
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: $emit,
cur_rename: ($($rename)?),
cur_skip: ($($skip)?),
cur_skip_if_none: ($($sin)?),
cur_name: (),
ftokens: [],
static_first: ($($sf)?),
input: ($($rest)*)
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: $emit:tt,
cur_rename: (),
cur_skip: ($($skip:tt)?),
cur_skip_if_none: ($($sin:tt)?),
cur_name: (),
ftokens: [],
static_first: ($($sf:tt)?),
input: ( #[bourne(rename = $renamed:literal, default)] $($rest:tt)* )
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: $emit,
cur_rename: ($renamed),
cur_skip: ($($skip)?),
cur_skip_if_none: ($($sin)?),
cur_name: (),
ftokens: [],
static_first: ($($sf)?),
input: ($($rest)*)
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: $emit:tt,
cur_rename: ($($rename:tt)?),
cur_skip: ($($skip:tt)?),
cur_skip_if_none: ($($sin:tt)?),
cur_name: (),
ftokens: [],
static_first: ($($sf:tt)?),
input: ( $_fvis:vis $fname:ident : $($rest:tt)* )
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: $emit,
cur_rename: ($($rename)?),
cur_skip: ($($skip)?),
cur_skip_if_none: ($($sin)?),
cur_name: ($fname),
ftokens: [],
static_first: ($($sf)?),
input: ($($rest)*)
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: $emit:tt,
cur_rename: ($($_rn:tt)?),
cur_skip: (skip),
cur_skip_if_none: ($($_si:tt)?),
cur_name: ($fname:ident),
ftokens: [ $($_ft:tt)+ ],
static_first: ($($sf:tt)?),
input: ( , $($rest:tt)* )
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: $emit,
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: ($($sf)?),
input: ($($rest)*)
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: { $($emit:tt)* },
cur_rename: ($($rename:tt)?),
cur_skip: (),
cur_skip_if_none: (yes),
cur_name: ($fname:ident),
ftokens: [ $($_ft:tt)+ ],
static_first: (yes),
input: ( , $($rest:tt)* )
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: {
$($emit)*
if let ::core::option::Option::Some(ref __v) = $self.$fname {
$w.write_escaped_str(
$crate::__to_json_field_key!($fname, ($($rename)?))
)?;
$w.write_raw_bytes(b":")?;
$crate::ToJson::write_json(__v, $w)?;
$first = false;
}
},
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: (maybe),
input: ($($rest)*)
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: { $($emit:tt)* },
cur_rename: ($($rename:tt)?),
cur_skip: (),
cur_skip_if_none: (yes),
cur_name: ($fname:ident),
ftokens: [ $($_ft:tt)+ ],
static_first: ($($_sf:tt)?),
input: ( , $($rest:tt)* )
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: {
$($emit)*
if let ::core::option::Option::Some(ref __v) = $self.$fname {
if !$first { $w.write_raw_bytes(b",")?; }
$w.write_escaped_str(
$crate::__to_json_field_key!($fname, ($($rename)?))
)?;
$w.write_raw_bytes(b":")?;
$crate::ToJson::write_json(__v, $w)?;
$first = false;
}
},
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: (maybe),
input: ($($rest)*)
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: { $($emit:tt)* },
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: ($fname:ident),
ftokens: [ $($_ft:tt)+ ],
static_first: (yes),
input: ( , $($rest:tt)* )
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: {
$($emit)*
$w.write_raw_bytes(
::core::concat!("\"", ::core::stringify!($fname), "\":").as_bytes()
)?;
$crate::ToJson::write_json(&$self.$fname, $w)?;
$first = false;
},
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: (no),
input: ($($rest)*)
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: { $($emit:tt)* },
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: ($fname:ident),
ftokens: [ $($_ft:tt)+ ],
static_first: (no),
input: ( , $($rest:tt)* )
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: {
$($emit)*
$w.write_raw_bytes(
::core::concat!(",\"", ::core::stringify!($fname), "\":").as_bytes()
)?;
$crate::ToJson::write_json(&$self.$fname, $w)?;
},
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: (no),
input: ($($rest)*)
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: { $($emit:tt)* },
cur_rename: ($($rename:tt)?),
cur_skip: (),
cur_skip_if_none: (),
cur_name: ($fname:ident),
ftokens: [ $($_ft:tt)+ ],
static_first: ($($_sf:tt)?),
input: ( , $($rest:tt)* )
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: {
$($emit)*
if !$first { $w.write_raw_bytes(b",")?; }
$w.write_escaped_str(
$crate::__to_json_field_key!($fname, ($($rename)?))
)?;
$w.write_raw_bytes(b":")?;
$crate::ToJson::write_json(&$self.$fname, $w)?;
$first = false;
},
cur_rename: (),
cur_skip: (),
cur_skip_if_none: (),
cur_name: (),
ftokens: [],
static_first: (maybe),
input: ($($rest)*)
)
};
(
self_ref: $self:ident,
sink: $w:ident,
first: $first:ident,
emit: $emit:tt,
cur_rename: ($($rename:tt)?),
cur_skip: ($($skip:tt)?),
cur_skip_if_none: ($($sin:tt)?),
cur_name: ($fname:ident),
ftokens: [ $($ftokens:tt)* ],
static_first: ($($sf:tt)?),
input: ( $tok:tt $($rest:tt)* )
) => {
$crate::__to_json_named_walk!(
self_ref: $self,
sink: $w,
first: $first,
emit: $emit,
cur_rename: ($($rename)?),
cur_skip: ($($skip)?),
cur_skip_if_none: ($($sin)?),
cur_name: ($fname),
ftokens: [ $($ftokens)* $tok ],
static_first: ($($sf)?),
input: ($($rest)*)
)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __to_json_field_key {
($fname:ident, ($renamed:literal)) => {
$renamed
};
($fname:ident, ()) => {
::core::stringify!($fname)
};
}
#[macro_export]
macro_rules! json {
(
$(#[$attr:meta])*
$vis:vis struct $name:ident { $($body:tt)* }
) => {
$crate::__from_json_emit_struct_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
body: ($($body)*)
);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_named_body!(__lex, (Self), strict, $($body)*)
}
}
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
$crate::__to_json_named_body!(self, __w, $($body)*)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime $(,)? > { $($body:tt)* }
) => {
$crate::__from_json_emit_struct_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
body: ($($body)*)
);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_named_body!(__lex, (Self), strict, $($body)*)
}
}
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
$crate::__to_json_named_body!(self, __w, $($body)*)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident ( $fty:ty $(,)? ) ;
) => {
$(#[$attr])*
$vis struct $name($fty);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
::core::result::Result::Ok(Self(
<$fty as $crate::FromJson<'_>>::from_lex(__lex)?,
))
}
}
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
$crate::ToJson::write_json(&self.0, __w)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime $(,)? > ( $fty:ty $(,)? ) ;
) => {
$(#[$attr])*
$vis struct $name<$lt>($fty);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
::core::result::Result::Ok(Self(
<$fty as $crate::FromJson<$lt>>::from_lex(__lex)?,
))
}
}
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
$crate::ToJson::write_json(&self.0, __w)
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident ( $fty1:ty, $($ftyn:ty),+ $(,)? ) ;
) => {
$(#[$attr])*
$vis struct $name($fty1, $($ftyn),+);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
if __lex.array_start()? {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, __lex.position()),
);
}
let __elem_0 = <$fty1 as $crate::FromJson<'_>>::from_lex(__lex)?;
$crate::__from_json_tuple_walk!(
lex: __lex,
self_ctor: (Self),
accum: [ __elem_0 ],
remaining: [ $(($ftyn))+ ]
)
}
}
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
__w.write_raw_bytes(b"[")?;
$crate::ToJson::write_json(&self.0, __w)?;
$crate::__to_json_tuple_walk!(
self_ref: self,
sink: __w,
idx: 1,
remaining: [ $(($ftyn))+ ]
);
__w.write_raw_bytes(b"]")?;
::core::result::Result::Ok(())
}
}
};
(
$(#[$attr:meta])*
$vis:vis struct $name:ident < $lt:lifetime $(,)? > ( $fty1:ty, $($ftyn:ty),+ $(,)? ) ;
) => {
$(#[$attr])*
$vis struct $name<$lt>($fty1, $($ftyn),+);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
if __lex.array_start()? {
return ::core::result::Result::Err(
$crate::Error::new($crate::ErrorKind::TypeMismatch, __lex.position()),
);
}
let __elem_0 = <$fty1 as $crate::FromJson<$lt>>::from_lex(__lex)?;
$crate::__from_json_tuple_walk!(
lex: __lex,
self_ctor: (Self),
accum: [ __elem_0 ],
remaining: [ $(($ftyn))+ ]
)
}
}
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
__w.write_raw_bytes(b"[")?;
$crate::ToJson::write_json(&self.0, __w)?;
$crate::__to_json_tuple_walk!(
self_ref: self,
sink: __w,
idx: 1,
remaining: [ $(($ftyn))+ ]
);
__w.write_raw_bytes(b"]")?;
::core::result::Result::Ok(())
}
}
};
(
#[bourne(untagged)]
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
variants_input: ($($variants)*)
);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_untagged_dispatch!(__lex, $name, ($($variants)*))
}
}
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_untagged_walk!(
receiver: __this,
sink: __w,
name: $name,
arms: { },
input: ($($variants)*)
)
}
}
};
(
#[bourne(untagged)]
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
variants_input: ($($variants)*)
);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_untagged_dispatch!(__lex, $name, ($($variants)*))
}
}
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_untagged_walk!(
receiver: __this,
sink: __w,
name: $name,
arms: { },
input: ($($variants)*)
)
}
}
};
(
#[bourne(tag = $tag:literal, content = $content:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
variants_input: ($($variants)*)
);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_adjacently_tagged_dispatch!(
__lex, $name, $tag, $content, ($($variants)*)
)
}
}
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_adjacent_walk!(
receiver: __this,
sink: __w,
name: $name,
tag: $tag,
content: $content,
arms: { },
cur_rename: (),
input: ($($variants)*)
)
}
}
};
(
#[bourne(tag = $tag:literal, content = $content:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
variants_input: ($($variants)*)
);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_adjacently_tagged_dispatch!(
__lex, $name, $tag, $content, ($($variants)*)
)
}
}
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_adjacent_walk!(
receiver: __this,
sink: __w,
name: $name,
tag: $tag,
content: $content,
arms: { },
cur_rename: (),
input: ($($variants)*)
)
}
}
};
(
#[bourne(tag = $tag:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
variants_input: ($($variants)*)
);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_internally_tagged_dispatch!(
__lex, $name, $tag, ($($variants)*)
)
}
}
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_internal_walk!(
receiver: __this,
sink: __w,
name: $name,
tag: $tag,
arms: { },
cur_rename: (),
input: ($($variants)*)
)
}
}
};
(
#[bourne(tag = $tag:literal)]
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
variants_input: ($($variants)*)
);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_internally_tagged_dispatch!(
__lex, $name, $tag, ($($variants)*)
)
}
}
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_internal_walk!(
receiver: __this,
sink: __w,
name: $name,
tag: $tag,
arms: { },
cur_rename: (),
input: ($($variants)*)
)
}
}
};
(
$(#[$attr:meta])*
$vis:vis enum $name:ident { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (),
variants_input: ($($variants)*)
);
impl<'input> $crate::FromJson<'input> for $name {
fn from_lex(__lex: &mut $crate::Lexer<'input>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_enum_dispatch!(__lex, $name, ($($variants)*))
}
}
impl $crate::ToJson for $name {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_enum_walk!(
receiver: __this,
sink: __w,
name: $name,
arms: { },
cur_rename: (),
input: ($($variants)*)
)
}
}
};
(
$(#[$attr:meta])*
$vis:vis enum $name:ident < $lt:lifetime $(,)? > { $($variants:tt)* }
) => {
$crate::__from_json_emit_enum_def!(
attrs: { $(#[$attr])* },
vis: $vis,
name: $name,
generics_def: (<$lt>),
variants_input: ($($variants)*)
);
impl<$lt> $crate::FromJson<$lt> for $name<$lt> {
fn from_lex(__lex: &mut $crate::Lexer<$lt>) -> ::core::result::Result<Self, $crate::Error> {
$crate::__from_json_enum_dispatch!(__lex, $name, ($($variants)*))
}
}
impl<$lt> $crate::ToJson for $name<$lt> {
fn write_json<__W: $crate::JsonWrite + ?::core::marker::Sized>(
&self,
__w: &mut __W,
) -> ::core::result::Result<(), __W::Error> {
let __this: &Self = self;
$crate::__to_json_enum_walk!(
receiver: __this,
sink: __w,
name: $name,
arms: { },
cur_rename: (),
input: ($($variants)*)
)
}
}
};
}