use thiserror::Error;
#[derive(Debug, Error)]
pub enum TopoError {
#[error("dependency cycle detected: {}", cycle.join(" -> "))]
Cycle { cycle: Vec<&'static str> },
#[error("subsystem {subsystem:?} depends on unknown subsystem {dependency:?}")]
UnknownDependency {
subsystem: &'static str,
dependency: &'static str,
},
}
#[derive(Debug, Error)]
pub enum BootstrapError {
#[error("subsystem dependency resolution failed: {0}")]
TopoSort(#[from] TopoError),
#[error("subsystem {name:?} failed to start: {cause}")]
SubsystemStart {
name: &'static str,
#[source]
cause: Box<dyn std::error::Error + Send + Sync + 'static>,
},
#[error(
"subsystem {name:?} failed to start; cleanup of already-started \
subsystems also encountered errors: {shutdown_errors:?}"
)]
StartAndShutdownFailure {
name: &'static str,
shutdown_errors: Vec<ShutdownError>,
},
}
#[derive(Debug, Error)]
pub enum ShutdownError {
#[error("subsystem {name:?} did not stop before the shutdown deadline")]
DeadlineExceeded { name: &'static str },
#[error("subsystem {name:?} panicked during shutdown")]
Panicked { name: &'static str },
#[error("subsystem {name:?} shutdown error: {cause}")]
SubsystemError {
name: &'static str,
#[source]
cause: Box<dyn std::error::Error + Send + Sync + 'static>,
},
}
impl From<BootstrapError> for crate::error::ClusterError {
fn from(e: BootstrapError) -> Self {
crate::error::ClusterError::Storage {
detail: e.to_string(),
}
}
}
impl From<ShutdownError> for crate::error::ClusterError {
fn from(e: ShutdownError) -> Self {
crate::error::ClusterError::Storage {
detail: e.to_string(),
}
}
}
impl From<TopoError> for crate::error::ClusterError {
fn from(e: TopoError) -> Self {
crate::error::ClusterError::Storage {
detail: e.to_string(),
}
}
}