use std::fmt::Display;
#[derive(Debug)]
pub enum Error {
FileOpen(std::io::Error, String),
FileCreate(std::io::Error, String),
FileCanonicalize(std::io::Error, String),
Cwd(std::io::Error, String),
UrlParseError(url::ParseError),
InvalidTremorUrl(String, String),
Generic(String),
}
impl From<String> for Error {
fn from(e: String) -> Self {
Self::Generic(e)
}
}
impl From<&str> for Error {
fn from(e: &str) -> Self {
Self::Generic(e.to_string())
}
}
impl From<url::ParseError> for Error {
fn from(e: url::ParseError) -> Self {
Self::UrlParseError(e)
}
}
impl Display for Error {
fn fmt(&self, w: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Error::FileOpen(e, f) => write!(w, "Failed to open file `{}`: {}", f, e),
Error::FileCreate(e, f) => write!(w, "Failed to create file `{}`: {}", f, e),
Error::FileCanonicalize(e, f) => {
write!(w, "Failed to canonicalize path `{}`: {}", f, e)
}
Error::Cwd(e, f) => write!(w, "Failed to change working directory `{}`: {}", f, e),
Error::UrlParseError(e) => write!(w, "Failed to parse URL `{}`", e),
Error::InvalidTremorUrl(reason, detail) => {
write!(w, "Invalid Tremor URL, {}: `{}`", reason, detail)
}
Error::Generic(msg) => write!(w, "Error: {}", msg),
}
}
}
impl std::error::Error for Error {}
#[doc(hidden)]
#[macro_export]
macro_rules! stry {
($e:expr) => {
match $e {
::std::result::Result::Ok(val) => val,
::std::result::Result::Err(err) => return ::std::result::Result::Err(err),
}
};
}