Skip to main content

ixdtf/parsers/
grammar.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//! ISO8601 specific grammar checks.
6
7/// Checks if ascii char is a `AKeyLeadingChar`.
8#[inline]
9pub(crate) const fn is_a_key_leading_char(ch: u8) -> bool {
10    ch.is_ascii_lowercase() || ch == b'_'
11}
12
13/// Checks if ascii char is an `AKeyChar`.
14#[inline]
15pub(crate) const fn is_a_key_char(ch: u8) -> bool {
16    is_a_key_leading_char(ch) || ch.is_ascii_digit() || ch == b'-'
17}
18
19/// Checks if ascii char is an `AnnotationValueComponent`.
20pub(crate) const fn is_annotation_value_component(ch: u8) -> bool {
21    ch.is_ascii_digit() || ch.is_ascii_alphabetic()
22}
23
24/// Checks if ascii char is a `TZLeadingChar`.
25#[inline]
26pub(crate) const fn is_tz_leading_char(ch: u8) -> bool {
27    ch.is_ascii_alphabetic() || ch == b'_' || ch == b'.'
28}
29
30/// Checks if ascii char is a `TZChar`.
31#[inline]
32pub(crate) const fn is_tz_char(ch: u8) -> bool {
33    is_tz_leading_char(ch) || ch.is_ascii_digit() || ch == b'-' || ch == b'+'
34}
35
36/// Checks if ascii char is a `TimeZoneIANAName` Separator.
37#[inline]
38pub(crate) const fn is_tz_name_separator(ch: u8) -> bool {
39    ch == b'/'
40}
41
42/// Checks if ascii char is an ascii sign.
43#[inline]
44pub(crate) const fn is_ascii_sign(ch: u8) -> bool {
45    ch == b'+' || ch == b'-'
46}
47
48/// Checks if ascii char is a `TimeSeparator`.
49#[inline]
50pub(crate) const fn is_time_separator(ch: u8) -> bool {
51    ch == b':'
52}
53
54/// Checks if ascii char is a `TimeDesignator`.
55#[inline]
56pub(crate) const fn is_time_designator(ch: u8) -> bool {
57    ch == b'T' || ch == b't'
58}
59
60#[inline]
61/// Checks if ascii char is a space.
62pub(crate) const fn is_space(ch: u8) -> bool {
63    ch == b' '
64}
65
66/// Checks if ascii char is a `DateTimeSeparator`.
67#[inline]
68pub(crate) const fn is_date_time_separator(ch: u8) -> bool {
69    is_time_designator(ch) || is_space(ch)
70}
71
72/// Checks if ascii char is a `UtcDesignator`.
73#[inline]
74pub(crate) const fn is_utc_designator(ch: u8) -> bool {
75    ch == b'Z' || ch == b'z'
76}
77
78/// Checks if ascii char is a `DurationDesignator`.
79#[inline]
80#[cfg(feature = "duration")]
81pub(crate) const fn is_duration_designator(ch: u8) -> bool {
82    ch == b'P' || ch == b'p'
83}
84
85/// Checks if ascii char is a `YearDesignator`.
86#[inline]
87#[cfg(feature = "duration")]
88pub(crate) const fn is_year_designator(ch: u8) -> bool {
89    ch == b'Y' || ch == b'y'
90}
91
92/// Checks if ascii char is a `MonthsDesignator`.
93#[inline]
94#[cfg(feature = "duration")]
95pub(crate) const fn is_month_designator(ch: u8) -> bool {
96    ch == b'M' || ch == b'm'
97}
98
99/// Checks if ascii char is a `WeekDesignator`.
100#[inline]
101#[cfg(feature = "duration")]
102pub(crate) const fn is_week_designator(ch: u8) -> bool {
103    ch == b'W' || ch == b'w'
104}
105
106/// Checks if ascii char is a `DayDesignator`.
107#[inline]
108#[cfg(feature = "duration")]
109pub(crate) const fn is_day_designator(ch: u8) -> bool {
110    ch == b'D' || ch == b'd'
111}
112
113/// checks if ascii char is a `DayDesignator`.
114#[inline]
115#[cfg(feature = "duration")]
116pub(crate) const fn is_hour_designator(ch: u8) -> bool {
117    ch == b'H' || ch == b'h'
118}
119
120/// Checks if ascii char is a `MinuteDesignator`.
121#[inline]
122#[cfg(feature = "duration")]
123pub(crate) const fn is_minute_designator(ch: u8) -> bool {
124    is_month_designator(ch)
125}
126
127/// checks if ascii char is a `SecondDesignator`.
128#[inline]
129#[cfg(feature = "duration")]
130pub(crate) const fn is_second_designator(ch: u8) -> bool {
131    ch == b'S' || ch == b's'
132}
133
134/// Checks if ascii char is a `DecimalSeparator`.
135#[inline]
136pub(crate) const fn is_decimal_separator(ch: u8) -> bool {
137    ch == b'.' || ch == b','
138}
139
140/// Checks if ascii char is an `AnnotationOpen`.
141#[inline]
142pub(crate) const fn is_annotation_open(ch: u8) -> bool {
143    ch == b'['
144}
145
146/// Checks if ascii char is an `AnnotationClose`.
147#[inline]
148pub(crate) const fn is_annotation_close(ch: u8) -> bool {
149    ch == b']'
150}
151
152/// Checks if ascii char is an `CriticalFlag`.
153#[inline]
154pub(crate) const fn is_critical_flag(ch: u8) -> bool {
155    ch == b'!'
156}
157
158/// Checks if ascii char is the `AnnotationKeyValueSeparator`.
159#[inline]
160pub(crate) const fn is_annotation_key_value_separator(ch: u8) -> bool {
161    ch == b'='
162}
163
164/// Checks if ascii char is a hyphen. Hyphens are used as a Date separator
165/// and as a `AttributeValueComponent` separator.
166#[inline]
167pub(crate) const fn is_hyphen(ch: u8) -> bool {
168    ch == b'-'
169}