pub mod contracts;
pub mod enums;
mod runtime;
#[cfg(test)]
mod tests;
use crate::contracts::SupervisedTask;
pub use runtime::{spawn_supervised, spawn_supervised_many, SupervisionResult, TaskRuntime};
pub struct Supervisor {
runtime: TaskRuntime,
}
impl Supervisor {
pub fn new() -> Self {
Self {
runtime: TaskRuntime::new(),
}
}
#[allow(clippy::should_implement_trait)]
pub fn add<T: SupervisedTask + 'static>(mut self, task: T) -> Self {
self.runtime.register(task);
self
}
pub fn add_many<T: SupervisedTask + 'static>(mut self, tasks: Vec<T>) -> Self {
self.runtime.register_many(tasks);
self
}
pub fn runtime(self) -> TaskRuntime {
self.runtime
}
pub async fn start(mut self) -> anyhow::Result<TaskRuntime> {
self.runtime.start_all().await?;
Ok(self.runtime)
}
pub async fn start_and_wait_any(mut self) -> anyhow::Result<SupervisionResult> {
self.runtime.start_all().await?;
Ok(self.runtime.wait_any().await)
}
pub async fn start_and_wait_all(mut self) -> anyhow::Result<Vec<SupervisionResult>> {
self.runtime.start_all().await?;
Ok(self.runtime.wait_all().await)
}
}
impl Default for Supervisor {
fn default() -> Self {
Self::new()
}
}