Skip to content
Clone
d13fe56
70 lines 1.7 KB Rust
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 is_connectivity(&self) -> bool {
match self {
Self::Config(_) => false,
Self::Database(error) => is_connect_error(error),
Self::Connect { .. } => true,
}
}
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),
}
}
}
fn is_connect_error(error: &DbErr) -> bool {
matches!(error, DbErr::ConnectionAcquire(_) | DbErr::Conn(_))
}
impl From<DbErr> for DbError {
fn from(error: DbErr) -> Self {
Self::Database(error)
}
}
pub type DbResult<T> = Result<T, DbError>;