#[macro_export]
macro_rules! proto {
($msgtype:ty { $($tt:tt)* }) => {
$crate::proto_internal!($msgtype { $($tt)* })
}
}
#[macro_export(local_inner_macros)]
#[doc(hidden)]
macro_rules! proto_internal {
(@merge $msg:ident $ident:ident : $expr:expr, $($rest:tt)*) => {
proto_internal!(@merge $msg $($rest)*);
};
(@merge $msg:ident $ident:ident : $expr:expr) => {
};
(@merge $msg:ident ..$expr:expr) => {
$crate::MergeFrom::merge_from(&mut $msg, $expr);
};
(@msg $msg:ident $submsg:ident : $($msgtype:ident)::+ { $($value:tt)* }, $($rest:tt)*) => {
proto_internal!(@msg $msg $submsg : $($msgtype)::+ { $($value)* });
proto_internal!(@msg $msg $($rest)*);
};
(@msg $msg:ident $submsg:ident : ::$($msgtype:ident)::+ { $($value:tt)* }, $($rest:tt)*) => {
proto_internal!(@msg $msg $submsg : ::$($msgtype)::+ { $($value)* });
proto_internal!(@msg $msg $($rest)*);
};
(@msg $msg:ident $submsg:ident : __ { $($value:tt)* }) => {
{
let mut $msg = $crate::__internal::paste!($msg.[<$submsg _mut>]());
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
}
};
(@msg $msg:ident $submsg:ident : $($msgtype:ident)::+ { $($value:tt)* }) => {
{
let mut $msg: <$($msgtype)::+ as $crate::MutProxied>::Mut<'_> = $crate::__internal::paste!($msg.[<$submsg _mut>]());
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
}
};
(@msg $msg:ident $submsg:ident : ::$($msgtype:ident)::+ { $($value:tt)* }) => {
{
let mut $msg: <::$($msgtype)::+ as $crate::MutProxied>::Mut<'_> = $crate::__internal::paste!($msg.[<$submsg _mut>]());
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
}
};
(@msg $msg:ident $ident:ident : [$($elems:tt)*], $($rest:tt)*) => {
proto_internal!(@msg $msg $ident : [$($elems)*]);
proto_internal!(@msg $msg $($rest)*);
};
(@msg $msg:ident $ident:ident : [$($elems:tt)*]) => {
{
let _repeated = $msg.$ident();
let elems = proto_internal!(@array $msg _repeated [] $($elems)*);
$crate::__internal::paste!($msg.[<set_ $ident>](elems.into_iter()));
}
};
(@array $msg:ident $repeated:ident [$($vals:expr),+] __ { $($value:tt)* }, $($rest:tt)*) => {
proto_internal!(@array $msg $repeated [
$($vals),+ ,
{
let mut $msg = $crate::__internal::get_repeated_default_value($crate::__internal::Private, $repeated);
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
] $($rest)*)
};
(@array $msg:ident $repeated:ident [$($vals:expr),+] __ { $($value:tt)* }) => {
[
$($vals),+ ,
{
let mut $msg = $crate::__internal::get_repeated_default_value($crate::__internal::Private, $repeated);
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
]
};
(@array $msg:ident $repeated:ident [] __ { $($value:tt)* }, $($rest:tt)*) => {
proto_internal!(@array $msg $repeated [
{
let mut $msg = $crate::__internal::get_repeated_default_value($crate::__internal::Private, $repeated);
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
] $($rest)*)
};
(@array $msg:ident $repeated:ident [] __ { $($value:tt)* }) => {
[
{
let mut $msg = $crate::__internal::get_repeated_default_value($crate::__internal::Private, $repeated);
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
]
};
(@array $msg:ident $repeated:ident [$($vals:expr),+] $($msgtype:ident)::+ { $($value:tt)* }, $($rest:tt)*) => {
proto_internal!(@array $msg $repeated [
$($vals),+ ,
{
let mut $msg = $($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
] $($rest)*)
};
(@array $msg:ident $repeated:ident [$($vals:expr),+] ::$($msgtype:ident)::+ { $($value:tt)* }, $($rest:tt)*) => {
proto_internal!(@array $msg $repeated [
$($vals),+ ,
{
let mut $msg = ::$($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
] $($rest)*)
};
(@array $msg:ident $repeated:ident [$($vals:expr),+] $($msgtype:ident)::+ { $($value:tt)* }) => {
[
$($vals),+ ,
{
let mut $msg = $($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
]
};
(@array $msg:ident $repeated:ident [$($vals:expr),+] ::$($msgtype:ident)::+ { $($value:tt)* }) => {
[
$($vals),+ ,
{
let mut $msg = ::$($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
]
};
(@array $msg:ident $repeated:ident [] $($msgtype:ident)::+ { $($value:tt)* }, $($rest:tt)*) => {
proto_internal!(@array $msg $repeated [
{
let mut $msg = $($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
] $($rest)*)
};
(@array $msg:ident $repeated:ident [] ::$($msgtype:ident)::+ { $($value:tt)* }, $($rest:tt)*) => {
proto_internal!(@array $msg $repeated [
{
let mut $msg = ::$($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
] $($rest)*)
};
(@array $msg:ident $repeated:ident [] $($msgtype:ident)::+ { $($value:tt)* }) => {
[
{
let mut $msg = $($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
]
};
(@array $msg:ident $repeated:ident [] ::$($msgtype:ident)::+ { $($value:tt)* }) => {
[
{
let mut $msg = ::$($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
]
};
(@array $msg:ident $map:ident [$($vals:expr),+] ($key:expr, __ { $($value:tt)* }), $($rest:tt)*) => {
proto_internal!(@array $msg $map [
$($vals),+ ,
(
$key,
{
let mut $msg = $crate::__internal::get_map_default_value($crate::__internal::Private, $map);
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
)
] $($rest)*)
};
(@array $msg:ident $map:ident [$($vals:expr),+] ($key:expr, __ { $($value:tt)* })) => {
[
$($vals),+ ,
(
$key,
{
let mut $msg = $crate::__internal::get_map_default_value($crate::__internal::Private, $map);
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
)
]
};
(@array $msg:ident $map:ident [] ($key:expr, __ { $($value:tt)* }), $($rest:tt)*) => {
proto_internal!(@array $msg $map [
(
$key,
{
let mut $msg = $crate::__internal::get_map_default_value($crate::__internal::Private, $map);
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
)
] $($rest)*)
};
(@array $msg:ident $map:ident [] ($key:expr, __ { $($value:tt)* })) => {
[
(
$key,
{
let mut $msg = $crate::__internal::get_map_default_value($crate::__internal::Private, $map);
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
)
]
};
(@array $msg:ident $map:ident [$($vals:expr),+] ($key:expr, $($msgtype:ident)::+ { $($value:tt)* }), $($rest:tt)*) => {
proto_internal!(@array $msg $map [
$($vals),+ ,
(
$key,
{
let mut $msg = $($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
)
] $($rest)*)
};
(@array $msg:ident $map:ident [$($vals:expr),+] ($key:expr, ::$($msgtype:ident)::+ { $($value:tt)* }), $($rest:tt)*) => {
proto_internal!(@array $msg $map [
$($vals),+ ,
(
$key,
{
let mut $msg = ::$($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
)
] $($rest)*)
};
(@array $msg:ident $map:ident [$($vals:expr),+] ($key:expr, $($msgtype:ident)::+ { $($value:tt)* })) => {
[
$($vals),+ ,
(
$key,
{
let mut $msg = $($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
)
]
};
(@array $msg:ident $map:ident [$($vals:expr),+] ($key:expr, ::$($msgtype:ident)::+ { $($value:tt)* })) => {
[
$($vals),+ ,
(
$key,
{
let mut $msg = ::$($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
)
]
};
(@array $msg:ident $map:ident [] ($key:expr, $($msgtype:ident)::+ { $($value:tt)* }), $($rest:tt)*) => {
proto_internal!(@array $msg $map [
(
$key,
{
let mut $msg = $($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
)
] $($rest)*)
};
(@array $msg:ident $map:ident [] ($key:expr, ::$($msgtype:ident)::+ { $($value:tt)* }), $($rest:tt)*) => {
proto_internal!(@array $msg $map [
(
$key,
{
let mut $msg = ::$($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
)
] $($rest)*)
};
(@array $msg:ident $map:ident [] ($key:expr, $($msgtype:ident)::+ { $($value:tt)* })) => {
[
(
$key,
{
let mut $msg = $($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
)
]
};
(@array $msg:ident $map:ident [] ::($key:expr, $($msgtype:ident)::+ { $($value:tt)* })) => {
[
(
$key,
{
let mut $msg = ::$($msgtype)::+::new();
proto_internal!(@merge $msg $($value)*);
proto_internal!(@msg $msg $($value)*);
$msg
}
)
]
};
(@array $msg:ident $repeated:ident [$($vals:expr),+] $expr:expr, $($rest:tt)*) => {
proto_internal!(@array $msg $repeated [$($vals),+, $expr] $($rest)*)
};
(@array $msg:ident $repeated:ident [$($vals:expr),+] $expr:expr) => {
[$($vals),+, $expr]
};
(@array $msg:ident $repeated:ident [] $expr:expr, $($rest:tt)*) => {
proto_internal!(@array $msg $repeated [$expr] $($rest)*)
};
(@array $msg:ident $repeated:ident [] $expr:expr) => {
[$expr]
};
(@array $msg:ident $repeated:ident []) => {
[]
};
(@msg $msg:ident $ident:ident : $expr:expr, $($rest:tt)*) => {
proto_internal!(@msg $msg $ident : $expr);
proto_internal!(@msg $msg $($rest)*);
};
(@msg $msg:ident $ident:ident : $expr:expr) => {
$crate::__internal::paste!($msg.[<set_ $ident>]($expr));
};
(@msg $msg:ident ..$expr:expr) => {
};
(@msg $msg:ident) => {};
(@merge $msg:ident) => {};
($msgtype:ty { $($tt:tt)* }) => {
{
let mut message = <$msgtype>::new();
proto_internal!(@merge message $($tt)*);
proto_internal!(@msg message $($tt)*);
message
}
};
}