ixdtf/
error.rs

1// This file is part of ICU4X. For terms of use, please see the file
2// called LICENSE at the top level of the ICU4X source tree
3// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4
5//! An error enum for representing `ixdtf` parsing errors.
6
7use displaydoc::Display;
8
9#[non_exhaustive]
10#[derive(PartialEq, Display, Clone, Copy, Debug)]
11/// The error returned by `ixdtf`'s parsers.
12pub enum ParseError {
13    #[displaydoc("Implementation error: this error must not throw.")]
14    ImplAssert,
15    #[displaydoc("Invalid float while parsing fraction part.")]
16    ParseFloat,
17    #[displaydoc("Parsing ended abruptly while parsing {location}")]
18    AbruptEnd { location: &'static str },
19    #[displaydoc("Unexpected character found after parsing was completed.")]
20    InvalidEnd,
21
22    // Date related errors
23    #[displaydoc("Parsed month value not in a valid range.")]
24    InvalidMonthRange,
25    #[displaydoc("Parsed day value not in a valid range.")]
26    InvalidDayRange,
27    #[displaydoc("Invalid chracter while parsing year value.")]
28    DateYear,
29    #[displaydoc("Invalid character while parsing extended year value.")]
30    DateExtendedYear,
31    #[displaydoc("Invalid caracter while parsing month value.")]
32    DateMonth,
33    #[displaydoc("Invalid character while parsing day value.")]
34    DateDay,
35    #[displaydoc("Unexpected end while parsing a date value.")]
36    DateUnexpectedEnd,
37
38    // Time Related errors
39    #[displaydoc("Time is required.")]
40    TimeRequired,
41    #[displaydoc("Invalid character while parsing hour value.")]
42    TimeHour,
43    #[displaydoc("Invalid character while parsing minute/second value in (0, 59] range.")]
44    TimeMinuteSecond,
45    #[displaydoc("Invalid character while parsing second value in (0, 60] range.")]
46    TimeSecond,
47    #[displaydoc("Invalid character while parsing fraction part value.")]
48    FractionPart,
49    #[displaydoc("Invalid character while parsing date separator.")]
50    DateSeparator,
51    #[displaydoc("Invalid character while parsing time separator.")]
52    TimeSeparator,
53    #[displaydoc("Invalid character while parsing decimal separator.")]
54    DecimalSeparator,
55
56    // Annotation Related Errors
57    #[displaydoc("Invalid annotation.")]
58    InvalidAnnotation,
59    #[displaydoc("Invalid annotation open character.")]
60    AnnotationOpen,
61    #[displaydoc("Invalid annotation close character.")]
62    AnnotationClose,
63    #[displaydoc("Invalid annotation character.")]
64    AnnotationChar,
65    #[displaydoc("Invalid annotation key-value separator character.")]
66    AnnotationKeyValueSeparator,
67    #[displaydoc("Invalid annotation key leading character.")]
68    AnnotationKeyLeadingChar,
69    #[displaydoc("Invalid annotation key character.")]
70    AnnotationKeyChar,
71    #[displaydoc("Expected annotation value character must exist after hyphen.")]
72    AnnotationValueCharPostHyphen,
73    #[displaydoc("Invalid annotation value character.")]
74    AnnotationValueChar,
75
76    // Duplicate calendar with critical.
77    #[displaydoc("Duplicate calendars cannot be provided when one is critical.")]
78    CriticalDuplicateCalendar,
79    #[displaydoc("Unrecognized annoation is marked as critical.")]
80    UnrecognizedCritical,
81
82    // Time Zone Errors
83    #[displaydoc("Invalid time zone leading character.")]
84    TzLeadingChar,
85    #[displaydoc("Expected time zone character after '/'.")]
86    IanaCharPostSeparator,
87    #[displaydoc("Invalid IANA time zone character after '/'.")]
88    IanaChar,
89    #[displaydoc("Invalid time zone character after '/'.")]
90    UtcTimeSeparator,
91
92    // MonthDay Errors
93    #[displaydoc("MonthDay must begin with a month or '--'")]
94    MonthDayHyphen,
95
96    // Duration Errors
97    #[displaydoc("Invalid duration designator.")]
98    DurationDisgnator,
99    #[displaydoc("Provided Duration field value exceeds supported range.")]
100    DurationValueExceededRange,
101    #[displaydoc("Invalid date duration part order.")]
102    DateDurationPartOrder,
103    #[displaydoc("Invalid time duration part order.")]
104    TimeDurationPartOrder,
105    #[displaydoc("Invalid time duration designator.")]
106    TimeDurationDesignator,
107}
108
109impl core::error::Error for ParseError {}
110
111impl ParseError {
112    pub(crate) fn abrupt_end(location: &'static str) -> Self {
113        ParseError::AbruptEnd { location }
114    }
115}