use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Error {
InvalidData(String),
InvalidOption(String),
Unimplemented(&'static str),
Backend(String),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::InvalidData(s) => write!(f, "invalid data: {s}"),
Error::InvalidOption(s) => write!(f, "invalid option: {s}"),
Error::Unimplemented(s) => write!(f, "{s} is outside this port's scope"),
Error::Backend(s) => write!(f, "backend error: {s}"),
}
}
}
impl std::error::Error for Error {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_format_per_variant() {
let e = Error::InvalidData("bad input".into());
assert_eq!(e.to_string(), "invalid data: bad input");
let e = Error::InvalidOption("eclevel=Z".into());
assert_eq!(e.to_string(), "invalid option: eclevel=Z");
let e = Error::Unimplemented("foo");
assert_eq!(e.to_string(), "foo is outside this port's scope");
let e = Error::Backend("qrcode crate failed".into());
assert_eq!(e.to_string(), "backend error: qrcode crate failed");
}
#[test]
fn equality_across_variants() {
assert_eq!(
Error::InvalidData("x".into()),
Error::InvalidData("x".into())
);
assert_ne!(
Error::InvalidData("x".into()),
Error::InvalidData("y".into())
);
assert_ne!(
Error::InvalidData("x".into()),
Error::InvalidOption("x".into())
);
assert_ne!(Error::Unimplemented("foo"), Error::Backend("foo".into()));
}
}