60 lines
1.3 KiB
Rust
60 lines
1.3 KiB
Rust
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)),
|
|
}
|
|
}};
|
|
}
|