use std::any::Any;
use super::channels::JobCancelReceiver;
use super::job_completion::JobCompletion;
pub trait JobResult: Any + Send + Sync {
fn as_any(&self) -> &dyn Any;
fn into_any(self: Box<Self>) -> Box<dyn Any>;
}
#[async_trait::async_trait]
pub trait Job: Send + Sync {
fn is_async(&self) -> bool;
fn run(&self, _rx: JobCancelReceiver) -> JobCompletion {
unimplemented!()
}
async fn run_async_cancellable(&self, mut rx: JobCancelReceiver) -> JobCompletion {
tokio::select! {
_ = rx.changed() => {
tracing::debug!("async job got cancel message. cancelling.");
JobCompletion::Cancelled
}
job_result = self.run_async() => {
JobCompletion::Finished(job_result)
},
}
}
async fn run_async(&self) -> Box<dyn JobResult> {
unimplemented!()
}
}
impl<T: Job + 'static> From<T> for Box<dyn Job> {
fn from(job: T) -> Self {
Box::new(job) as Box<dyn Job>
}
}