use std::fmt;
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub enum DateError {
InvalidDate,
InvalidTime,
GregorianConversionError,
ParseError(ParseErrorKind),
ArithmeticOverflow,
InvalidOrdinal,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub enum ParseErrorKind {
FormatMismatch,
InvalidNumber,
InvalidDateValue,
InvalidTimeValue,
UnsupportedSpecifier,
InvalidMonthName,
InvalidWeekdayName,
}
impl fmt::Display for DateError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
DateError::InvalidDate => write!(
f,
"Invalid Persian date: year, month, or day is out of range or inconsistent"
),
DateError::InvalidTime => {
write!(f, "Invalid time: hour, minute, or second is out of range")
}
DateError::GregorianConversionError => {
write!(f, "Failed to convert to or from the Gregorian calendar")
}
DateError::ParseError(kind) => write!(f, "Parsing error: {}", kind),
DateError::ArithmeticOverflow => write!(
f,
"Date arithmetic resulted in an overflow or a date outside the supported range"
),
DateError::InvalidOrdinal => {
write!(f, "Invalid ordinal day: must be between 1 and 365/366")
}
}
}
}
impl fmt::Display for ParseErrorKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ParseErrorKind::FormatMismatch => write!(f, "input string does not match the format string's structure"),
ParseErrorKind::InvalidNumber => write!(f, "a numeric component could not be parsed or had an incorrect number of digits"),
ParseErrorKind::InvalidDateValue => write!(f, "the parsed components form a logically invalid date (e.g., day 30 in Esfand of a common year)"),
ParseErrorKind::InvalidTimeValue => write!(f, "the parsed components form a logically invalid time (e.g., hour 24)"),
ParseErrorKind::UnsupportedSpecifier => write!(f, "the format string contains a specifier that is not supported for parsing"),
ParseErrorKind::InvalidMonthName => write!(f, "could not recognize a valid Persian month name for the '%B' specifier"),
ParseErrorKind::InvalidWeekdayName => write!(f, "could not recognize a valid Persian weekday name (currently unused)"),
}
}
}
impl std::error::Error for DateError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
None
}
}