use crate::handle::Handle;
use crate::manager::TaskManager;
use tokio::sync::mpsc;
#[async_trait::async_trait]
pub trait Task {
async fn task(self, mgr: TaskManager<Self>) -> Option<()>
where
Self: Sized;
}
pub fn run<T>(task: T) -> Handle<T>
where
T: Task + Send + 'static,
{
let (tx, rx) = mpsc::unbounded_channel();
let (handle, manager) = (Handle::new(tx), TaskManager::new(rx));
tokio::spawn(async move {
task.task(manager).await;
});
handle
}
pub fn run_global<T>(task: T)
where
T: Task + Send + Sync + 'static,
{
crate::global::set(run(task));
}