use std::fmt::{self, Display, Formatter}; use sea_orm::DbErr; #[derive(Debug)] pub enum DbError { Config(String), Database(DbErr), Connect { label: String, source: DbErr }, } impl DbError { pub fn config(message: impl Into) -> Self { Self::Config(message.into()) } pub fn connect(label: impl Into, source: DbErr) -> Self { Self::Connect { label: label.into(), source, } } pub fn label(&self) -> Option<&str> { match self { Self::Connect { label, .. } => Some(label), _ => None, } } } impl Display for DbError { fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { match self { Self::Config(message) => write!(formatter, "config: {message}"), Self::Database(error) => Display::fmt(error, formatter), Self::Connect { label, source } => write!(formatter, "{label}: {source}"), } } } impl std::error::Error for DbError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { match self { Self::Config(_) => None, Self::Database(error) => Some(error), Self::Connect { source, .. } => Some(source), } } } impl From for DbError { fn from(error: DbErr) -> Self { Self::Database(error) } } pub type DbResult = Result;