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