pub use AwaitResult::{Canceled, Completed};
#[derive(Debug, Eq, PartialEq)]
pub enum AwaitResult<T> {
Canceled,
Completed(T),
}
impl<T> AwaitResult<T> {
pub fn is_canceled(&self) -> bool {
match self {
Canceled => true,
_ => false,
}
}
pub fn is_completed(&self) -> bool {
return !self.is_canceled();
}
pub fn result(self) -> Option<T> {
match self {
AwaitResult::Canceled => None,
AwaitResult::Completed(res) => Some(res),
}
}
}
#[macro_export]
macro_rules! try_await {
($fut: expr) => {{
use tokio::select;
use $crate::AwaitResult;
let mut cancel_event = $crate::task::TASK_CANCEL_EVENT.with(|event| event.clone());
select! {
biased; result = $fut => {
if *cancel_event.borrow() {
AwaitResult::Canceled
} else {
AwaitResult::Completed(result)
}
}
Ok(_) = cancel_event.changed() => {
AwaitResult::Canceled
},
}
}};
}