use core::fmt;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Error {
InvalidParameter {
param: &'static str,
reason: &'static str,
},
IncompatibleParameters,
CapacityExceeded,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::InvalidParameter { param, reason } => {
write!(f, "invalid parameter `{param}`: {reason}")
}
Error::IncompatibleParameters => {
f.write_str("structures were built with incompatible parameters")
}
Error::CapacityExceeded => {
f.write_str("structure is full: insertion exceeded its capacity")
}
}
}
}
#[cfg(feature = "std")]
impl std::error::Error for Error {}
#[cfg(all(test, feature = "std"))]
mod tests {
use super::*;
#[test]
fn test_display_invalid_parameter() {
let err = Error::InvalidParameter {
param: "rate",
reason: "must be in (0.0, 1.0)",
};
assert_eq!(
err.to_string(),
"invalid parameter `rate`: must be in (0.0, 1.0)"
);
}
#[test]
fn test_display_incompatible_parameters() {
assert_eq!(
Error::IncompatibleParameters.to_string(),
"structures were built with incompatible parameters"
);
}
#[test]
fn test_display_capacity_exceeded() {
assert_eq!(
Error::CapacityExceeded.to_string(),
"structure is full: insertion exceeded its capacity"
);
}
#[test]
fn test_is_std_error() {
fn assert_error<E: std::error::Error>(_: &E) {}
assert_error(&Error::CapacityExceeded);
}
#[test]
fn test_clone_and_eq() {
let err = Error::InvalidParameter {
param: "k",
reason: "must be greater than zero",
};
assert_eq!(err.clone(), err);
assert_ne!(err, Error::CapacityExceeded);
}
}