use std::fmt;
use std::io::{
Error as IoError,
ErrorKind
};
use std::result::Result as StdResult;
use conciliator::{
Inline,
Buffer
};
use conciliator::edit::EditError;
use rusqlite::Error as SqlError;
use toml::de::Error as DeserializeError;
use toml::ser::Error as SerializeError;
pub type Result<T> = StdResult<T, Error>;
#[derive(Debug)]
pub enum Error {
Sql(SqlError),
Io(IoError),
Toml(TomlError),
NoConfig,
Message(String),
}
#[derive(Debug)]
pub enum TomlError {
Serialize(SerializeError),
Deserialize(DeserializeError),
}
impl Error {
pub fn not_found(err: &str) -> Self {
Self::Io(
IoError::new(ErrorKind::NotFound, err)
)
}
}
impl std::error::Error for Error {}
impl Inline for Error {
fn inline(&self, buffer: &mut Buffer) {
match self {
Self::Sql(e) => buffer.push(e),
Self::Io(e) => buffer.push(e),
Self::Toml(e) => buffer.push(e),
Self::NoConfig => buffer.push("No config file found!"),
Self::Message(m) => buffer.push(m),
};
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Debug::fmt(self, f)
}
}
impl From<IoError> for Error {
fn from(err: IoError) -> Self {Self::Io(err)}
}
impl From<SqlError> for Error {
fn from(err: SqlError) -> Self {Self::Sql(err)}
}
impl From<TomlError> for Error {
fn from(err: TomlError) -> Self {Self::Toml(err)}
}
impl From<SerializeError> for Error {
fn from(err: SerializeError) -> Self {Self::Toml(err.into())}
}
impl From<DeserializeError> for Error {
fn from(err: DeserializeError) -> Self {Self::Toml(err.into())}
}
impl From<EditError<SerializeError>> for Error {
fn from(err: EditError<SerializeError>) -> Self {
match err {
EditError::Serialize(e) => e.into(),
EditError::Io(e) => e.into()
}
}
}
impl From<SerializeError> for TomlError {
fn from(err: SerializeError) -> Self {Self::Serialize(err)}
}
impl From<DeserializeError> for TomlError {
fn from(err: DeserializeError) -> Self {Self::Deserialize(err)}
}
impl fmt::Display for TomlError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Serialize(e) => e.fmt(f),
Self::Deserialize(e) => e.fmt(f)
}
}
}