use std::fmt; #[derive(Debug)] pub enum BootstrapError { Database(db::DbError), Cache(cache::CacheError), Storage(storage::StorageError), InvalidConfig(String), } impl fmt::Display for BootstrapError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { BootstrapError::Database(err) => write!(f, "database error: {err}"), BootstrapError::Cache(err) => write!(f, "cache error: {err}"), BootstrapError::Storage(err) => write!(f, "storage error: {err}"), BootstrapError::InvalidConfig(msg) => write!(f, "invalid config: {msg}"), } } } impl std::error::Error for BootstrapError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { match self { BootstrapError::Database(err) => Some(err), BootstrapError::Cache(err) => Some(err), BootstrapError::Storage(err) => Some(err), BootstrapError::InvalidConfig(_) => None, } } } impl From for BootstrapError { fn from(err: db::DbError) -> Self { BootstrapError::Database(err) } } impl From for BootstrapError { fn from(err: cache::CacheError) -> Self { BootstrapError::Cache(err) } } impl From for BootstrapError { fn from(err: storage::StorageError) -> Self { BootstrapError::Storage(err) } }