|
|
|
@ -33,7 +33,7 @@ |
|
|
|
|
#[macro_export] |
|
|
|
|
macro_rules! proto { |
|
|
|
|
($msgtype:ty { $($tt:tt)* }) => { |
|
|
|
|
$crate::proto_internal!($msgtype { $($tt)* }); |
|
|
|
|
$crate::proto_internal!($msgtype { $($tt)* }) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -41,29 +41,48 @@ macro_rules! proto { |
|
|
|
|
#[doc(hidden)] |
|
|
|
|
macro_rules! proto_internal { |
|
|
|
|
// nested message,
|
|
|
|
|
(@msg $msg:ident $submsg:ident : $msgtype:ty { $field:ident : $($value:tt)* }, $($rest:tt)*) => { |
|
|
|
|
proto_internal!(@msg $msg $submsg : $msgtype { $field : $($value)* }); |
|
|
|
|
(@msg $msg:ident $submsg:ident : $($msgtype:ident)::+ { $field:ident : $($value:tt)* }, $($rest:tt)*) => { |
|
|
|
|
proto_internal!(@msg $msg $submsg : $($msgtype)::+ { $field : $($value)* }); |
|
|
|
|
proto_internal!(@msg $msg $($rest)*); |
|
|
|
|
}; |
|
|
|
|
(@msg $msg:ident $submsg:ident : ::$($msgtype:ident)::+ { $field:ident : $($value:tt)* }, $($rest:tt)*) => { |
|
|
|
|
proto_internal!(@msg $msg $submsg : ::$($msgtype)::+ { $field : $($value)* }); |
|
|
|
|
proto_internal!(@msg $msg $($rest)*); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// nested message
|
|
|
|
|
(@msg $msg:ident $submsg:ident : $msgtype:ty { $field:ident : $($value:tt)* }) => { |
|
|
|
|
(@msg $msg:ident $submsg:ident : $($msgtype:ident)::+ { $field:ident : $($value:tt)* }) => { |
|
|
|
|
{ |
|
|
|
|
let mut $msg: <$($msgtype)::+ as $crate::Proxied>::Mut<'_> = $crate::__internal::paste!($msg.[<$submsg _mut>]()); |
|
|
|
|
proto_internal!(@msg $msg $field : $($value)*); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
(@msg $msg:ident $submsg:ident : ::$($msgtype:ident)::+ { $field:ident : $($value:tt)* }) => { |
|
|
|
|
{ |
|
|
|
|
let mut $msg: <$msgtype as $crate::Proxied>::Mut<'_> = $crate::__internal::paste!($msg.[<$submsg _mut>]()); |
|
|
|
|
let mut $msg: <::$($msgtype)::+ as $crate::Proxied>::Mut<'_> = $crate::__internal::paste!($msg.[<$submsg _mut>]()); |
|
|
|
|
proto_internal!(@msg $msg $field : $($value)*); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// empty nested message,
|
|
|
|
|
(@msg $msg:ident $submsg:ident : $msgtype:ty { }, $($rest:tt)*) => { |
|
|
|
|
proto_internal!(@msg $msg $submsg : $msgtype { }); |
|
|
|
|
(@msg $msg:ident $submsg:ident : $($msgtype:ident)::+ { }, $($rest:tt)*) => { |
|
|
|
|
proto_internal!(@msg $msg $submsg : $($msgtype)::+ { }); |
|
|
|
|
proto_internal!(@msg $msg $($rest)*); |
|
|
|
|
}; |
|
|
|
|
(@msg $msg:ident $submsg:ident : ::$($msgtype:ident)::+ { }, $($rest:tt)*) => { |
|
|
|
|
proto_internal!(@msg $msg $submsg : ::$($msgtype)::+ { }); |
|
|
|
|
proto_internal!(@msg $msg $($rest)*); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// empty nested message
|
|
|
|
|
(@msg $msg:ident $submsg:ident : $msgtype:ty { }) => { |
|
|
|
|
(@msg $msg:ident $submsg:ident : $($msgtype:ident)::+ { }) => { |
|
|
|
|
{ |
|
|
|
|
let mut $msg: <$($msgtype)::+ as $crate::Proxied>::Mut<'_> = $crate::__internal::paste!($msg.[<$submsg _mut>]()); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
(@msg $msg:ident $submsg:ident : ::$($msgtype:ident)::+ { }) => { |
|
|
|
|
{ |
|
|
|
|
let mut $msg = $crate::__internal::paste!($msg.[<$submsg _mut>]()); |
|
|
|
|
let mut $msg: <::$($msgtype)::+ as $crate::Proxied>::Mut<'_> = $crate::__internal::paste!($msg.[<$submsg _mut>]()); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -76,9 +95,7 @@ macro_rules! proto_internal { |
|
|
|
|
|
|
|
|
|
// field: expr
|
|
|
|
|
(@msg $msg:ident $ident:ident : $expr:expr) => { |
|
|
|
|
$crate::__internal::paste!{ |
|
|
|
|
$msg.[<set_ $ident>]($expr); |
|
|
|
|
} |
|
|
|
|
$crate::__internal::paste!($msg.[<set_ $ident>]($expr)); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
(@msg $msg:ident) => {}; |
|
|
|
|