#[macro_export]
macro_rules! serializer {
{
#[derive( $($derive_tokens:tt),* )]
pub(crate) struct $name:ident<$type:ty> { $($body:tt)* }
} => {
__serializer! {
derives = [ $($derive_tokens),* ],
struct_def = { pub(crate) struct $name; },
name = ($name),
ttype = ($type),
body = ( $($body)* ),
}
};
{
pub(crate) struct $name:ident<$type:ty> { $($body:tt)* }
} => {
__serializer! {
derives = [],
struct_def = { pub(crate) struct $name; },
name = ($name),
ttype = ($type),
body = ( $($body)* ),
}
};
{
#[derive( $($derive_tokens:tt),* )]
pub struct $name:ident<$type:ty> { $($body:tt)* }
} => {
__serializer! {
derives = [ $($derive_tokens),* ],
struct_def = { pub struct $name; },
name = ($name),
ttype = ($type),
body = ( $($body)* ),
}
};
{
pub struct $name:ident<$type:ty> { $($body:tt)* }
} => {
__serializer! {
derives = [],
struct_def = { pub struct $name; },
name = ($name),
ttype = ($type),
body = ( $($body)* ),
}
};
{
#[derive( $($derive_tokens:tt),* )]
struct $name:ident<$type:ty> { $($body:tt)* }
} => {
__serializer! {
derives = [ $($derive_tokens),* ],
struct_def = { struct $name; },
name = ($name),
ttype = ($type),
body = ( $($body)* ),
}
};
{
struct $name:ident<$type:ty> { $($body:tt)* }
} => {
__serializer! {
derives = [],
struct_def = { struct $name; },
name = ($name),
ttype = ($type),
body = ( $($body)* ),
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! __serializer {
{
derives = [],
struct_def = { $($struct_def_tokens:tt)* },
name = ( $name:ident ),
ttype = ( $type:ty ),
body = ( $($body:tt)* ),
} => {
#[allow(dead_code, missing_docs)]
$($struct_def_tokens)*
__serializer! { impl $name<$type> { $($body)* } }
};
{
derives = [ $($derive_tokens:tt),* ],
struct_def = { $($struct_def_tokens:tt)* },
name = ( $name:ident ),
ttype = ( $type:ty ),
body = ( $($body:tt)* ),
} => {
#[allow(dead_code, missing_docs)]
#[derive( $($derive_tokens),* )]
$($struct_def_tokens)*
__serializer! { impl $name<$type> { $($body)* } }
};
{
impl $name:ident<$type:ty> { $($rest:tt)* }
} => {
impl $crate::Serializer<$type> for $name {
fn serialize_into(&self, v: &$type, b: &mut $crate::Builder) {
__serializer! { [b, v] $($rest)* }
}
}
#[allow(dead_code)]
impl $name {
fn serialize(v: &$type) -> String {
$name.serialize(v)
}
fn serialize_iter<'a, I>(v: I) -> String
where
I: IntoIterator<Item = &'a $type>,
{
$name.serialize_iter(v)
}
}
};
{ [$b:expr, $v:expr] } => {};
{
[$b:expr, $v:expr] attr($attr:ident) $($rest:tt)*
} => {
__serializer! { [$b, $v] attr($attr, $attr) $($rest)* }
};
{
[$b:expr, $v:expr] attr($key:ident, $field:ident) $($rest:tt)*
} => {
$b.attr(stringify!($key), &$v.$field);
__serializer! { [$b, $v] $($rest)* }
};
{
[$b:expr, $v:expr] has_one($key:ident, $has_one_ser:ident) $($rest:tt)*
} => {
__serializer! { [$b, $v] has_one($key, $key, $has_one_ser) $($rest)* }
};
{
[$b:expr, $v:expr] has_one($key:ident, $field:ident, $has_one_ser:ident) $($rest:tt)*
} => {
$b.has_one(stringify!($key), &$v.$field, &$has_one_ser);
__serializer! { [$b, $v] $($rest)* }
};
{
[$b:expr, $v:expr] has_many($key:ident, $has_one_ser:ident) $($rest:tt)*
} => {
__serializer! { [$b, $v] has_many($key, $key, $has_one_ser) $($rest)* }
};
{
[$b:expr, $v:expr] has_many($key:ident, $field:ident, $has_one_ser:ident) $($rest:tt)*
} => {
$b.has_many(stringify!($key), &$v.$field, &$has_one_ser);
__serializer! { [$b, $v] $($rest)* }
};
}