| use std::error; |
| use std::fmt::{self, Formatter}; |
| use std::path::{Path, PathBuf}; |
| |
| use crate::docfs::PathError; |
| |
| #[derive(Debug)] |
| pub(crate) struct Error { |
| pub(crate) file: PathBuf, |
| pub(crate) error: String, |
| } |
| |
| impl error::Error for Error {} |
| |
| impl std::fmt::Display for Error { |
| fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { |
| let file = self.file.display().to_string(); |
| if file.is_empty() { |
| write!(f, "{}", self.error) |
| } else { |
| write!(f, "\"{}\": {}", self.file.display(), self.error) |
| } |
| } |
| } |
| |
| impl PathError for Error { |
| fn new<S, P: AsRef<Path>>(e: S, path: P) -> Error |
| where |
| S: ToString + Sized, |
| { |
| Error { file: path.as_ref().to_path_buf(), error: e.to_string() } |
| } |
| } |
| |
| #[macro_export] |
| macro_rules! try_none { |
| ($e:expr, $file:expr) => {{ |
| use std::io; |
| match $e { |
| Some(e) => e, |
| None => { |
| return Err(<$crate::error::Error as $crate::docfs::PathError>::new( |
| io::Error::new(io::ErrorKind::Other, "not found"), |
| $file, |
| )); |
| } |
| } |
| }}; |
| } |
| |
| #[macro_export] |
| macro_rules! try_err { |
| ($e:expr, $file:expr) => {{ |
| match $e { |
| Ok(e) => e, |
| Err(e) => return Err(Error::new(e, $file)), |
| } |
| }}; |
| } |