#[macro_export]
macro_rules! def_wrapper {
($name:ident = before = ($fn_args:ident) >> $before:expr ; after = ($wrapped_res:ident) >> $after:expr;) => {
macro_rules! $name {
(_ : _; $args:expr => $wrapped_body_ret:ty = $wrapped_body:expr) => {
{
let mut _before = {
let $fn_args = $args;
$before
};
let mut $wrapped_res: $wrapped_body_ret = (|| $wrapped_body)();
let _ = $after;
$wrapped_res
}
};
($before_block_res:ident : $before_block_ty:ty ; $args:expr => $wrapped_body_ret:ty = $wrapped_body:expr) => {
{
let mut $before_block_res: $before_block_ty = {
let $fn_args = $args;
$before
};
let mut $wrapped_res: $wrapped_body_ret = (|$before_block_res: &mut $before_block_ty| $wrapped_body)(&mut $before_block_res);
let _ = $after;
$wrapped_res
}
};
(mut $before_block_res:ident : $before_block_ty:ty ; $args:expr => $wrapped_body_ret:ty = $wrapped_body:expr) => {
{
let mut $before_block_res: $before_block_ty = {
let $fn_args = $args;
$before
};
let mut $wrapped_res: $wrapped_body_ret = (|mut $before_block_res: &mut $before_block_ty| $wrapped_body)(&mut $before_block_res);
let _ = $after;
$wrapped_res
}
};
}
}
}
#[macro_export]
macro_rules! wrap_with {
($wrapper:ident >> fn $name:ident ($($arg:ident : $argtype:ty),*) -> $ret:ty = $body:expr) => {
#[allow(unused_mut, unused_parens)]
pub fn $name($($arg : $argtype),*) -> $ret {
$wrapper!( _ : _ ; ($(&$arg),*) => $ret = $body)
}
};
($wrapper:ident -> $before_block_res:ident : $before_block_ty:ty; >> fn $name:ident ($($arg:ident : $argtype:ty),*) -> $ret:ty = $body:expr) => {
#[allow(unused_mut, unused_parens)]
pub fn $name($($arg : $argtype),*) -> $ret {
$wrapper!( $before_block_res : $before_block_ty ; ($(&$arg),*) => $ret = $body)
}
};
($wrapper:ident -> mut $before_block_res:ident : $before_block_ty:ty; >> fn $name:ident ($($arg:ident : $argtype:ty),*) -> $ret:ty = $body:expr) => {
#[allow(unused_mut, unused_parens)]
pub fn $name($($arg : $argtype),*) -> $ret {
$wrapper!( mut $before_block_res : $before_block_ty ; ($(&$arg),*) => $ret = $body)
}
};
}