macro_rules! forward {
(assert = $assert:path; $($sigs:tt)*) => {
$crate::forward::forward!(@each $assert, [] [], $($sigs)*);
};
(assert = $assert:path,
via = self . $get:ident () $(. $field:ident)*,
via_mut = self . $get_mut:ident () $(. $field_mut:ident)*;
$($sigs:tt)*) => {
$crate::forward::forward!(
@each $assert, [.$get() $(. $field)*] [.$get_mut() $(. $field_mut)*], $($sigs)*
);
};
(@each $assert:path, [$($recv:tt)*] [$($recv_mut:tt)*],) => {};
(@each $assert:path, [$($recv:tt)*] [$($recv_mut:tt)*],
fn $name:ident(&self $(, $arg:ident: $ty:ty)* $(,)?) -> $ret:ty; $($rest:tt)*) => {
fn $name(&self $(, $arg: $ty)*) -> $ret { self $($recv)* .$name($($arg),*) }
$crate::forward::forward!(@each $assert, [$($recv)*] [$($recv_mut)*], $($rest)*);
};
(@each $assert:path, [$($recv:tt)*] [$($recv_mut:tt)*],
fn $name:ident(&self $(, $arg:ident: $ty:ty)* $(,)?); $($rest:tt)*) => {
fn $name(&self $(, $arg: $ty)*) { self $($recv)* .$name($($arg),*) }
$crate::forward::forward!(@each $assert, [$($recv)*] [$($recv_mut)*], $($rest)*);
};
(@each $assert:path, [$($recv:tt)*] [$($recv_mut:tt)*],
fn $name:ident(&mut self $(, $arg:ident: $ty:ty)* $(,)?) -> $ret:ty; $($rest:tt)*) => {
fn $name(&mut self $(, $arg: $ty)*) -> $ret {
$assert(stringify!($name));
self $($recv_mut)* .$name($($arg),*)
}
$crate::forward::forward!(@each $assert, [$($recv)*] [$($recv_mut)*], $($rest)*);
};
(@each $assert:path, [$($recv:tt)*] [$($recv_mut:tt)*],
fn $name:ident(&mut self $(, $arg:ident: $ty:ty)* $(,)?); $($rest:tt)*) => {
fn $name(&mut self $(, $arg: $ty)*) {
$assert(stringify!($name));
self $($recv_mut)* .$name($($arg),*)
}
$crate::forward::forward!(@each $assert, [$($recv)*] [$($recv_mut)*], $($rest)*);
};
}
pub(crate) use forward;