use std::fmt;
#[derive(Debug)]
pub enum Error {
Database(String),
Rusqlite(rusqlite::Error),
Refinery(refinery::Error),
OpenMls(String),
}
impl std::error::Error for Error {}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Database(msg) => write!(f, "Database error: {}", msg),
Self::Rusqlite(err) => write!(f, "SQLite error: {}", err),
Self::Refinery(msg) => write!(f, "Migration error: {}", msg),
Self::OpenMls(msg) => write!(f, "OpenMLS error: {}", msg),
}
}
}
impl From<rusqlite::Error> for Error {
fn from(e: rusqlite::Error) -> Self {
Self::Rusqlite(e)
}
}
impl From<refinery::Error> for Error {
fn from(e: refinery::Error) -> Self {
Self::Refinery(e)
}
}
impl From<std::io::Error> for Error {
fn from(e: std::io::Error) -> Self {
Self::Database(format!("IO error: {}", e))
}
}
impl From<Error> for rusqlite::Error {
fn from(err: Error) -> Self {
rusqlite::Error::FromSqlConversionFailure(
0,
rusqlite::types::Type::Text,
Box::new(std::io::Error::new(
std::io::ErrorKind::InvalidData,
err.to_string(),
)),
)
}
}