ex 0.1.3

A libstd wrapper with more detailed errors
Documentation
use crate::Wrapper;

use quick_error::quick_error;
use std::ops::{Deref, DerefMut};
use std::path::PathBuf;

quick_error! {
    #[derive(Debug)]
    pub enum Error {
        Filesystem(path: PathBuf, action: &'static str, err: ::std::io::Error) {
            cause(err)
            description(err.description())
            display("error {} \"{}\": {}", action, path.display(), err)
        }

        Filesystem2(
            src: PathBuf,
            dst: PathBuf,
            action: &'static str,
            err: ::std::io::Error
        ) {
            cause(err)
            description(err.description())
            display(
                "error {} \"{}\" to \"{}\": {}",
                action,
                src.display(),
                dst.display(),
                err
            )
        }
    }
}

impl Deref for Error {
    type Target = ::std::io::Error;

    fn deref(&self) -> &Self::Target {
        match *self {
            Error::Filesystem(_, _, ref err) => err,
            Error::Filesystem2(_, _, _, ref err) => err,
        }
    }
}

impl DerefMut for Error {
    fn deref_mut(&mut self) -> &mut Self::Target {
        match *self {
            Error::Filesystem(_, _, ref mut err) => err,
            Error::Filesystem2(_, _, _, ref mut err) => err,
        }
    }
}

impl Wrapper<::std::io::Error> for Error {
    fn into_inner(self) -> ::std::io::Error {
        match self {
            Error::Filesystem(_, _, err) => err,
            Error::Filesystem2(_, _, _, err) => err,
        }
    }
}

pub type Result<T> = ::std::result::Result<T, Error>;