use std;
#[derive(Fail, Debug)]
pub enum Error {
#[fail(display = "{}", _0)]
Kind(ErrorKind),
#[fail(display = "{}", _0)]
Io(#[cause] std::io::Error),
#[fail(display = "{}", _0)]
Custom(#[cause] Custom),
}
impl From<ErrorKind> for Error {
fn from(e: ErrorKind) -> Error {
Error::Kind(e)
}
}
impl From<std::io::Error> for Error {
fn from(e: std::io::Error) -> Error {
Error::Io(e)
}
}
impl From<Custom> for Error {
fn from(e: Custom) -> Error {
Error::Custom(e)
}
}
#[derive(Fail, Debug)]
#[fail(display = "Error: {}, Kind: {}", error, kind)]
pub struct Custom {
kind: ErrorKind,
error: Box<std::error::Error + Sync + Send>,
}
impl Custom {
pub fn new<E>(kind: ErrorKind, error: E) -> Custom
where
E: Into<Box<std::error::Error + Sync + Send>>,
{
Custom {
kind,
error: error.into(),
}
}
}
#[derive(Copy, Clone, Eq, PartialEq, Debug, Fail)]
pub enum ErrorKind {
#[fail(display = "Given directory not found")]
DirectoryNotFound,
#[fail(display = "Invalid format")]
InvalidFormat,
}
pub type Result<T> = std::result::Result<T, Error>;