sql_reverse_error 0.1.2

sql reverse error
Documentation
use mysql;
use quicli;
use serde_yaml;
use tera;

#[allow(dead_code)]
pub type Result<T> = std::result::Result<T, Error>;

#[derive(Debug)]
pub enum Error {
    RegexError(regex::Error),
    SerdeYamlError(serde_yaml::Error),
    SerdeJsonError(serde_json::Error),
    IoError(std::io::Error),
    QuiCliError(quicli::prelude::Error),
    TeraError(tera::Error),
    MysqlUrlError(mysql::UrlError),
    MysqlError(mysql::error::Error),
    PostgresError(tokio_postgres::Error),
    CustomError(String),
}

#[derive(Debug, Clone, Default)]
pub struct CustomError {
    pub message: String,
}

impl From<String> for CustomError {
    fn from(message: String) -> CustomError {
        CustomError { message }
    }
}

impl<'a> From<CustomError> for &'a dyn std::error::Error {
    fn from(error: CustomError) -> &'a dyn std::error::Error {
        error.into()
    }
}

impl std::error::Error for CustomError {}

impl std::fmt::Display for CustomError {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "{}", self.message)
    }
}

impl std::error::Error for Error {
    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
        match &self {
            Error::RegexError(ref err) => Some(err),
            Error::SerdeYamlError(ref error) => Some(error),
            Error::SerdeJsonError(ref error) => Some(error),
            Error::IoError(ref error) => Some(error),
            Error::QuiCliError(ref error) => {
                let s: CustomError = From::from(error.to_string());
                Some(s.into())
            }
            Error::TeraError(ref error) => Some(error),
            Error::MysqlUrlError(ref error) => Some(error),
            Error::MysqlError(ref error) => Some(error),
            Error::PostgresError(ref error) => Some(error),
            Error::CustomError(ref error) => {
                let s: CustomError = From::from(error.to_string());
                Some(s.into())
            }
        }
    }
}

impl std::fmt::Display for Error {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match &self {
            Error::RegexError(ref error) => error.fmt(f),
            Error::SerdeYamlError(ref error) => error.fmt(f),
            Error::SerdeJsonError(ref error) => error.fmt(f),
            Error::IoError(ref error) => error.fmt(f),
            Error::QuiCliError(ref error) => error.fmt(f),
            Error::TeraError(ref error) => error.fmt(f),
            Error::MysqlUrlError(ref error) => error.fmt(f),
            Error::MysqlError(ref error) => error.fmt(f),
            Error::PostgresError(ref error) => error.fmt(f),
            Error::CustomError(ref error) => error.fmt(f),
        }
    }
}

impl From<String> for Error {
    fn from(error: String) -> Self {
        Error::CustomError(error)
    }
}

impl From<mysql::error::Error> for Error {
    fn from(error: mysql::error::Error) -> Self {
        Error::MysqlError(error)
    }
}

impl From<tokio_postgres::Error> for Error {
    fn from(error: tokio_postgres::Error) -> Self {
        Error::PostgresError(error)
    }
}

impl From<mysql::UrlError> for Error {
    fn from(error: mysql::UrlError) -> Self {
        Error::MysqlUrlError(error)
    }
}

impl From<tera::Error> for Error {
    fn from(error: tera::Error) -> Self {
        Error::TeraError(error)
    }
}

impl From<quicli::prelude::Error> for Error {
    fn from(error: quicli::prelude::Error) -> Error {
        Error::CustomError(error.to_string())
    }
}

impl From<serde_yaml::Error> for Error {
    fn from(error: serde_yaml::Error) -> Error {
        Error::SerdeYamlError(error)
    }
}

impl From<serde_json::Error> for Error {
    fn from(error: serde_json::Error) -> Error {
        Error::SerdeJsonError(error)
    }
}

impl From<std::io::Error> for Error {
    fn from(s: std::io::Error) -> Self {
        Error::IoError(s)
    }
}

impl From<regex::Error> for Error {
    fn from(s: regex::Error) -> Self {
        Error::RegexError(s)
    }
}