use core::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ValidationError {
InvalidDate {
rule: &'static str,
},
OutOfRange {
what: &'static str,
},
}
impl fmt::Display for ValidationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::InvalidDate { rule } => write!(f, "invalid date: {rule}"),
Self::OutOfRange { what } => write!(f, "value out of range: {what}"),
}
}
}
impl core::error::Error for ValidationError {}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_support::{debug, display};
#[test]
fn validation_error_display_invalid_date() {
let err = ValidationError::InvalidDate {
rule: "month-out-of-range",
};
assert_eq!(display(err).as_str(), "invalid date: month-out-of-range");
}
#[test]
fn validation_error_display_out_of_range() {
let err = ValidationError::OutOfRange {
what: "year < 1583",
};
assert_eq!(display(err).as_str(), "value out of range: year < 1583");
}
#[test]
fn validation_error_display_has_no_trailing_period() {
for err in [
ValidationError::InvalidDate { rule: "r" },
ValidationError::OutOfRange { what: "w" },
] {
assert!(!display(err).as_str().ends_with('.'));
}
}
#[test]
fn validation_error_is_error_trait() {
let err: &dyn core::error::Error = &ValidationError::InvalidDate { rule: "r" };
assert!(err.source().is_none());
}
#[test]
fn validation_error_copy_eq() {
let err = ValidationError::OutOfRange { what: "year" };
let copy = err;
assert_eq!(err, copy);
}
#[test]
fn errors_debug() {
assert!(
debug(ValidationError::InvalidDate { rule: "r" })
.as_str()
.contains("InvalidDate")
);
assert!(
debug(ValidationError::OutOfRange { what: "w" })
.as_str()
.contains("OutOfRange")
);
}
}