bcbe85c
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<String>) -> Self {
Self::Config(message.into())
}
pub fn connect(label: impl Into<String>, 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<DbErr> for DbError {
fn from(error: DbErr) -> Self {
Self::Database(error)
}
}
pub type DbResult<T> = Result<T, DbError>;