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