#[macro_export]
macro_rules! process {
(input: $input:expr, state: $state:expr, metrics: $metrics:expr, with: $effect:ident => $handle:expr) => {{
let mut gen =
$crate::co::Gen::new(|co| $crate::handle::handle(co, $state, $metrics, $input));
let mut co_result = gen.resume_with($crate::Resume::default());
loop {
match co_result {
$crate::co::CoState::Yielded($effect) => {
let resume = match $handle {
Ok(resume) => resume,
Err(error) => {
$crate::tracing::error!("Error when processing effect: {error:?}");
$crate::Resume::default()
}
};
co_result = gen.resume_with(resume)
}
$crate::co::CoState::Complete(result) => {
return result.map_err(Into::into);
}
}
}
}};
}
#[macro_export]
macro_rules! perform {
($co:expr, $effect:expr) => {
perform!($co, $effect, $crate::Resume::Continue(_))
};
($co:expr, $effect:expr, $pat:pat) => {
perform!($co, $effect, $pat => ())
};
($co:expr, $effect:expr, $pat:pat => $expr:expr $(,)?) => {
match $co.yield_($effect).await {
$pat => $expr,
resume => {
return ::core::result::Result::Err($crate::Error::UnexpectedResume(
resume,
stringify!($pat)
)
.into())
}
}
};
}