use crate::error::IsleError;
use crate::hook::CancelToken;
use std::sync::mpsc;
pub struct Task<T = String> {
rx: mpsc::Receiver<Result<T, IsleError>>,
cancel: CancelToken,
}
impl<T> Task<T> {
pub(crate) fn new(rx: mpsc::Receiver<Result<T, IsleError>>, cancel: CancelToken) -> Self {
Self { rx, cancel }
}
pub fn wait(self) -> Result<T, IsleError> {
self.rx
.recv()
.map_err(|e| IsleError::RecvFailed(e.to_string()))?
}
pub fn cancel(&self) {
self.cancel.cancel();
}
pub fn try_recv(&self) -> Option<Result<T, IsleError>> {
self.rx.try_recv().ok()
}
pub fn cancel_token(&self) -> &CancelToken {
&self.cancel
}
}