use std::fmt;
#[derive(Debug, Clone)]
pub enum SupervisorError {
NoChildren(String),
AllChildrenFailed(String),
ShuttingDown(String),
ChildAlreadyExists(String),
ChildNotFound(String),
InitializationFailed {
child_id: String,
reason: String,
},
InitializationTimeout {
child_id: String,
timeout: std::time::Duration,
},
}
impl fmt::Display for SupervisorError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SupervisorError::NoChildren(name) => {
write!(f, "supervisor '{name}' has no children")
}
SupervisorError::AllChildrenFailed(name) => {
write!(
f,
"all children failed for supervisor '{name}' - restart intensity limit exceeded"
)
}
SupervisorError::ShuttingDown(name) => {
write!(
f,
"supervisor '{name}' is shutting down - operation not permitted"
)
}
SupervisorError::ChildAlreadyExists(id) => {
write!(
f,
"child with id '{id}' already exists - use a unique identifier"
)
}
SupervisorError::ChildNotFound(id) => {
write!(
f,
"child with id '{id}' not found - it may have already terminated"
)
}
SupervisorError::InitializationFailed { child_id, reason } => {
write!(f, "child '{child_id}' initialization failed: {reason}")
}
SupervisorError::InitializationTimeout { child_id, timeout } => {
write!(
f,
"child '{child_id}' initialization timed out after {timeout:?}"
)
}
}
}
}
impl std::error::Error for SupervisorError {}