use std::fmt;
use std::path::PathBuf;
#[derive(Debug)]
pub struct Error(pub(crate) Kind);
impl Error {
pub(crate) fn report(&self) {
let current_error: &dyn std::error::Error = self;
let mut current_error = Some(current_error);
let mut ind = 0;
eprintln!("Error:");
while let Some(error) = current_error {
eprintln!(" {}: {}", ind, error);
ind += 1;
current_error = error.source();
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(&self.0, f)
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match &self.0 {
Kind::CreateFile { ref source, .. } => Some(source),
Kind::FlushFile(ref source) => Some(source),
}
}
}
#[derive(Debug)]
pub(crate) enum Kind {
CreateFile {
source: std::io::Error,
path: PathBuf,
},
FlushFile(std::io::Error),
}
impl fmt::Display for Kind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::CreateFile { path, .. } => {
write!(f, "cannot create output file. path={}", path.display())
}
Self::FlushFile { .. } => write!(f, "cannot flush output buffer"),
}
}
}