use std::{
io,
path::{Path, PathBuf},
};
use thiserror::Error;
#[derive(Debug, Error)]
#[error(transparent)]
pub struct Error(#[from] InnerError);
impl Error {
pub fn path(&self) -> Option<&Path> {
let InnerError::Io { ref path, .. } = self.0;
Some(path)
}
pub fn io(&self) -> Option<&io::Error> {
let InnerError::Io { ref source, .. } = self.0;
Some(source)
}
pub fn into_io(self) -> Option<io::Error> {
let InnerError::Io { source, .. } = self.0;
Some(source)
}
}
impl From<Error> for io::Error {
fn from(err: Error) -> io::Error {
let InnerError::Io { ref source, .. } = err.0;
io::Error::new(source.kind(), err)
}
}
#[derive(Debug, Error)]
pub enum InnerError {
#[error("IO error at '{path}': {source}")]
Io {
path: PathBuf,
source: io::Error,
},
}