use std::fmt;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum Error {
NoWorkingTime,
OutOfRange,
UnknownZone {
name: String,
},
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::NoWorkingTime => f.write_str("no working time found"),
Error::OutOfRange => f.write_str(
"result is outside the supported range -009999-01-02T01:59:59Z to 9999-12-30T22:00:00Z",
),
Error::UnknownZone { name } => write!(f, "unknown time zone `{name}`"),
}
}
}
impl std::error::Error for Error {}
#[cfg(test)]
mod tests {
use super::Error;
#[test]
fn is_a_thread_safe_std_error() {
fn check<E: std::error::Error + Send + Sync + 'static>() {}
check::<Error>();
}
#[test]
fn is_hashable() {
let errors: std::collections::HashSet<Error> = [
Error::NoWorkingTime,
Error::NoWorkingTime,
Error::OutOfRange,
]
.into();
assert_eq!(errors.len(), 2);
}
#[test]
fn no_working_time_message_names_no_cause() {
assert_eq!(Error::NoWorkingTime.to_string(), "no working time found");
}
#[test]
fn messages_are_lowercase_without_trailing_punctuation() {
for error in [
Error::NoWorkingTime,
Error::OutOfRange,
Error::UnknownZone { name: "X".into() },
] {
let message = error.to_string();
assert!(message.starts_with(char::is_lowercase), "{message}");
assert!(!message.ends_with('.'), "{message}");
}
}
}