// 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) -> fm
t::Result {
if let ParseError::AbruptEnd { location } = *self {
write!(f, "Parsing ended abruptly while parsing {location}")
} else {
f.write_str(self.to_static_string())
}
}
}