use alloc::vec::Vec;
#[derive(Debug)]
pub enum JmapCoroutineState<Y, R> {
Yielded(Y),
Complete(R),
}
pub trait JmapCoroutine {
type Yield;
type Return;
fn resume(&mut self, arg: Option<&[u8]>) -> JmapCoroutineState<Self::Yield, Self::Return>;
}
#[derive(Debug)]
pub enum JmapYield {
WantsRead,
WantsWrite(Vec<u8>),
}
#[macro_export]
macro_rules! jmap_try {
($coroutine:expr, $arg:expr $(,)?) => {
match $crate::coroutine::JmapCoroutine::resume($coroutine, $arg) {
$crate::coroutine::JmapCoroutineState::Yielded(y) => {
return $crate::coroutine::JmapCoroutineState::Yielded(y.into());
}
$crate::coroutine::JmapCoroutineState::Complete(Err(err)) => {
return $crate::coroutine::JmapCoroutineState::Complete(Err(err.into()));
}
$crate::coroutine::JmapCoroutineState::Complete(Ok(value)) => value,
}
};
}