#[macro_export]
macro_rules! okey {
(fn $($tokens:tt)*) => ($crate::okey!(
@parse_signature [fn] $($tokens)*
););
(@parse_signature [$($sig:tt)*] -> Result<$ty:ty> {
$($body:tt)*
}) => ($crate::okey!(
@parse_body [$($sig)* -> ::std::result::Result<$ty, Box<dyn ::std::error::Error>>] [] $($body)*
););
(@parse_signature [$($sig:tt)*] $tt:tt $($tail:tt)*) => ($crate::okey!(
@parse_signature [$($sig)* $tt] $($tail)*
););
(@parse_body [$($sig:tt)*] [$($body:tt)*] return Err($expr:expr); $($tail:tt)*) => ($crate::okey!(
@parse_body [$($sig)*] [$($body)*
return ::std::result::Result::Err(($expr).into());
] $($tail)*
););
(@parse_body [$($sig:tt)*] [$($body:tt)*] return $expr:expr; $($tail:tt)*) => ($crate::okey!(
@parse_body [$($sig)*] [$($body)*
return ::std::result::Result::Ok($expr);
] $($tail)*
););
(@parse_body [$($sig:tt)*] [$($body:tt)*] $stmt:stmt; $($tail:tt)*) => ($crate::okey!(
@parse_body [$($sig)*] [$($body)* $stmt] $($tail)*
););
(@parse_body [$($sig:tt)*] [$($body:tt)*]) => ($($sig)* {
$($body)*
});
}