Source code
Revision control
Copy as Markdown
Other Tools
// This file is part of ICU4X. For terms of use, please see the file
// called LICENSE at the top level of the ICU4X source tree
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
//! An error enum for representing `ixdtf` parsing errors.
use core::fmt;
#[non_exhaustive]
#[derive(PartialEq, Clone, Copy, Debug)]
/// The error returned by `ixdtf`'s parsers.
pub enum ParseError {
ImplAssert,
NonAsciiCodePoint,
ParseFloat,
AbruptEnd { location: &'static str },
InvalidEnd,
// Date related errors
InvalidMonthRange,
InvalidDayRange,
DateYear,
DateExtendedYear,
DateMonth,
DateDay,
DateUnexpectedEnd,
// Time Related errors
TimeRequired,
TimeHour,
TimeMinuteSecond,
TimeSecond,
FractionPart,
DateSeparator,
TimeSeparator,
DecimalSeparator,
// Annotation Related Errors
InvalidAnnotation,
AnnotationOpen,
AnnotationClose,
AnnotationChar,
AnnotationKeyValueSeparator,
AnnotationKeyLeadingChar,
AnnotationKeyChar,
AnnotationValueCharPostHyphen,
AnnotationValueChar,
InvalidMinutePrecisionOffset,
// Duplicate calendar with critical.
CriticalDuplicateCalendar,
UnrecognizedCritical,
// Time Zone Errors
TzLeadingChar,
IanaCharPostSeparator,
IanaChar,
UtcTimeSeparator,
OffsetNeedsSign,
// MonthDay Errors
MonthDayHyphen,
// Duration Errors
DurationDisgnator,
DurationValueExceededRange,
DateDurationPartOrder,
TimeDurationPartOrder,
TimeDurationDesignator,
AmbiguousTimeMonthDay,
AmbiguousTimeYearMonth,
InvalidMonthDay,
}
impl core::error::Error for ParseError {}
impl ParseError {
pub(crate) fn abrupt_end(location: &'static str) -> Self {
ParseError::AbruptEnd { location }
}
/// Convert this error to a static string representation
pub fn to_static_string(&self) -> &'static str {
match *self {
ParseError::ImplAssert => "Implementation error: this error must not throw.",
ParseError::NonAsciiCodePoint => "Code point was not ASCII",
ParseError::ParseFloat => "Invalid float while parsing fraction part.",
ParseError::AbruptEnd { .. } => "Parsing ended abruptly.",
ParseError::InvalidEnd => "Unexpected character found after parsing was completed.",
// Date related errors
ParseError::InvalidMonthRange => "Parsed month value not in a valid range.",
ParseError::InvalidDayRange => "Parsed day value not in a valid range.",
ParseError::DateYear => "Invalid chracter while parsing year value.",
ParseError::DateExtendedYear => "Invalid character while parsing extended year value.",
ParseError::DateMonth => "Invalid character while parsing month value.",
ParseError::DateDay => "Invalid character while parsing day value.",
ParseError::DateUnexpectedEnd => "Unexpected end while parsing a date value.",
ParseError::TimeRequired => "Time is required.",
ParseError::TimeHour => "Invalid character while parsing hour value.",
ParseError::TimeMinuteSecond => {
"Invalid character while parsing minute/second value in (0, 59] range."
}
ParseError::TimeSecond => {
"Invalid character while parsing second value in (0, 60] range."
}
ParseError::FractionPart => "Invalid character while parsing fraction part value.",
ParseError::DateSeparator => "Invalid character while parsing date separator.",
ParseError::TimeSeparator => "Invalid character while parsing time separator.",
ParseError::DecimalSeparator => "Invalid character while parsing decimal separator.",
// Annotation Related Errors
ParseError::InvalidAnnotation => "Invalid annotation.",
ParseError::AnnotationOpen => "Invalid annotation open character.",
ParseError::AnnotationClose => "Invalid annotation close character.",
ParseError::AnnotationChar => "Invalid annotation character.",
ParseError::AnnotationKeyValueSeparator => {
"Invalid annotation key-value separator character."
}
ParseError::AnnotationKeyLeadingChar => "Invalid annotation key leading character.",
ParseError::AnnotationKeyChar => "Invalid annotation key character.",
ParseError::AnnotationValueCharPostHyphen => {
"Expected annotation value character must exist after hyphen."
}
ParseError::AnnotationValueChar => "Invalid annotation value character.",
ParseError::InvalidMinutePrecisionOffset => "Offset must be minute precision",
ParseError::CriticalDuplicateCalendar => {
"Duplicate calendars cannot be provided when one is critical."
}
ParseError::UnrecognizedCritical => "Unrecognized annoation is marked as critical.",
ParseError::TzLeadingChar => "Invalid time zone leading character.",
ParseError::IanaCharPostSeparator => "Expected time zone character after '/'.",
ParseError::IanaChar => "Invalid IANA time zone character after '/'.",
ParseError::UtcTimeSeparator => "Invalid time zone character after '/'.",
ParseError::OffsetNeedsSign => "UTC offset needs a sign",
ParseError::MonthDayHyphen => "MonthDay must begin with a month or '--'",
ParseError::DurationDisgnator => "Invalid duration designator.",
ParseError::DurationValueExceededRange => {
"Provided Duration field value exceeds supported range."
}
ParseError::DateDurationPartOrder => "Invalid date duration part order.",
ParseError::TimeDurationPartOrder => "Invalid time duration part order.",
ParseError::TimeDurationDesignator => "Invalid time duration designator.",
ParseError::AmbiguousTimeMonthDay => "Time is ambiguous with MonthDay",
ParseError::AmbiguousTimeYearMonth => "Time is ambiguous with YearMonth",
ParseError::InvalidMonthDay => "MonthDay was not valid.",
}
}
}
impl fmt::Display for ParseError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if let ParseError::AbruptEnd { location } = *self {
write!(f, "Parsing ended abruptly while parsing {location}")
} else {
f.write_str(self.to_static_string())
}
}
}