use crate::{
error::{WorkerError, WorkerStateError},
monitor::{MonitorError, shutdown::Shutdown},
worker::context::WorkerContext,
};
#[derive(Debug, Clone)]
pub struct MonitorContext {
pub(super) shutdown: Shutdown,
pub(super) workers: Vec<WorkerContext>,
}
impl MonitorContext {
#[must_use]
pub fn workers(&self) -> &Vec<WorkerContext> {
&self.workers
}
pub fn shutdown(&self) -> Result<(), MonitorError> {
self.shutdown.start_shutdown();
for worker in &self.workers {
worker.wake();
}
Ok(())
}
pub fn resume_worker(&self, name: &str) -> Result<(), WorkerError> {
self.get_worker(name)?.resume()
}
pub fn pause_worker(&self, name: &str) -> Result<(), WorkerError> {
self.get_worker(name)?.pause()
}
pub fn stop_worker(&self, name: &str) -> Result<(), WorkerError> {
self.get_worker(name)?.stop()
}
pub fn wake_worker(&self, name: &str) -> Result<(), WorkerError> {
self.get_worker(name)?.wake();
Ok(())
}
pub fn get_worker(&self, name: &str) -> Result<&WorkerContext, WorkerError> {
self.workers
.iter()
.find(|w| w.name() == name)
.ok_or_else(|| {
WorkerError::StateError(WorkerStateError::InvalidState("NOT_FOUND".to_owned()))
})
}
#[cfg(feature = "task-context")]
pub fn cancel_task(
&self,
worker: &str,
task_id: &str,
) -> Result<(), crate::error::BoxDynError> {
let worker = self.get_worker(worker)?;
let context = worker.get_task(task_id)?;
worker.cancel_task(&context)?;
Ok(())
}
}