1use std::fmt;
6
7use crate::keyword::{
8 KW_BINARY, KW_BOOLEAN, KW_CAL_ADDRESS, KW_CUTYPE_GROUP, KW_CUTYPE_INDIVIDUAL,
9 KW_CUTYPE_RESOURCE, KW_CUTYPE_ROOM, KW_CUTYPE_UNKNOWN, KW_DATE, KW_DATETIME, KW_DURATION,
10 KW_ENCODING_8BIT, KW_ENCODING_BASE64, KW_FBTYPE_BUSY, KW_FBTYPE_BUSY_TENTATIVE,
11 KW_FBTYPE_BUSY_UNAVAILABLE, KW_FBTYPE_FREE, KW_FLOAT, KW_INTEGER, KW_PARTSTAT_ACCEPTED,
12 KW_PARTSTAT_COMPLETED, KW_PARTSTAT_DECLINED, KW_PARTSTAT_DELEGATED, KW_PARTSTAT_IN_PROCESS,
13 KW_PARTSTAT_NEEDS_ACTION, KW_PARTSTAT_TENTATIVE, KW_PERIOD, KW_RANGE_THISANDFUTURE,
14 KW_RELATED_END, KW_RELATED_START, KW_RELTYPE_CHILD, KW_RELTYPE_PARENT, KW_RELTYPE_SIBLING,
15 KW_ROLE_CHAIR, KW_ROLE_NON_PARTICIPANT, KW_ROLE_OPT_PARTICIPANT, KW_ROLE_REQ_PARTICIPANT,
16 KW_RRULE, KW_RSVP_FALSE, KW_RSVP_TRUE, KW_TEXT, KW_TIME, KW_URI, KW_UTC_OFFSET,
17};
18use crate::parameter::util::{ParseResult, parse_single, parse_single_not_quoted};
19use crate::parameter::{Parameter, ParameterKind};
20use crate::string_storage::{Segments, StringStorage};
21use crate::syntax::{RawParameter, RawParameterValue};
22use crate::typed::TypedError;
23
24pub fn parse_rsvp(mut param: RawParameter<Segments<'_>>) -> ParseResult<'_> {
30 let span = param.span;
31 parse_single(&mut param, ParameterKind::RsvpExpectation).and_then(|v| {
32 if v.value.eq_str_ignore_ascii_case(KW_RSVP_TRUE) {
33 Ok(Parameter::RsvpExpectation { value: true, span })
34 } else if v.value.eq_str_ignore_ascii_case(KW_RSVP_FALSE) {
35 Ok(Parameter::RsvpExpectation { value: false, span })
36 } else {
37 Err(vec![TypedError::ParameterValueInvalid {
38 parameter: ParameterKind::RsvpExpectation,
39 value: v.value,
40 span,
41 }])
42 }
43 })
44}
45
46pub fn parse_tzid<'src>(mut param: RawParameter<Segments<'src>>) -> ParseResult<'src> {
54 let span = param.span;
55
56 #[cfg(feature = "jiff")]
57 let op = |v: RawParameterValue<Segments<'src>>| {
58 let tzid_str = v.value.resolve();
60 match jiff::tz::TimeZone::get(tzid_str.as_ref()) {
61 Ok(tz) => Ok(Parameter::TimeZoneIdentifier {
62 value: v.value,
63 span,
64 tz,
65 }),
66 Err(_) => Err(vec![TypedError::ParameterValueInvalid {
67 parameter: ParameterKind::TimeZoneIdentifier,
68 value: v.value,
69 span,
70 }]),
71 }
72 };
73
74 #[cfg(not(feature = "jiff"))]
75 let op = |v: RawParameterValue<Segments<'src>>| {
76 Ok(Parameter::TimeZoneIdentifier {
77 value: v.value,
78 span,
79 })
80 };
81
82 parse_single(&mut param, ParameterKind::TimeZoneIdentifier).and_then(op)
83}
84
85define_param_enum_with_unknown! {
86 #[derive(Default)]
87 pub enum CalendarUserType {
88 #[default]
90 Individual => KW_CUTYPE_INDIVIDUAL,
91 Group => KW_CUTYPE_GROUP,
93 Resource => KW_CUTYPE_RESOURCE,
95 Room => KW_CUTYPE_ROOM,
97 Unknown => KW_CUTYPE_UNKNOWN,
99 }
100
101 parser = pub fn parse_cutype;
102}
103
104define_param_enum! {
105 #[derive(Default)]
107 pub enum Encoding {
108 #[default]
111 Bit8 => KW_ENCODING_8BIT,
112 Base64 => KW_ENCODING_BASE64,
115 }
116
117 parser = pub fn parse_encoding;
118}
119
120define_param_enum_with_unknown! {
121 #[derive(Default)]
123 pub enum FreeBusyType {
124 #[default]
126 Free => KW_FBTYPE_FREE,
127 Busy => KW_FBTYPE_BUSY,
130 BusyUnavailable => KW_FBTYPE_BUSY_UNAVAILABLE,
132 BusyTentative => KW_FBTYPE_BUSY_TENTATIVE,
135 }
136
137 parser = pub fn parse_fbtype;
138}
139
140define_param_enum_with_unknown! {
141 pub enum ParticipationStatus {
142 NeedsAction => KW_PARTSTAT_NEEDS_ACTION,
143 Accepted => KW_PARTSTAT_ACCEPTED,
144 Declined => KW_PARTSTAT_DECLINED,
145 Tentative => KW_PARTSTAT_TENTATIVE,
146 Delegated => KW_PARTSTAT_DELEGATED,
147 Completed => KW_PARTSTAT_COMPLETED,
148 InProcess => KW_PARTSTAT_IN_PROCESS,
149 }
150
151 parser = pub fn parse_partstat;
152}
153
154define_param_enum! {
155 pub enum RecurrenceIdRange {
156 ThisAndFuture => KW_RANGE_THISANDFUTURE,
159
160 }
163
164 parser = pub fn parse_range;
165}
166
167define_param_enum! {
168 #[derive(Default)]
170 pub enum AlarmTriggerRelationship {
171 #[default]
174 Start => KW_RELATED_START,
175 End => KW_RELATED_END,
178 }
179
180 parser = pub fn parse_alarm_trigger_relationship;
181}
182
183define_param_enum_with_unknown! {
184 #[derive(Default)]
185 pub enum RelationshipType {
186 #[default]
188 Parent => KW_RELTYPE_PARENT,
189 Child => KW_RELTYPE_CHILD,
192 Sibling => KW_RELTYPE_SIBLING,
194 }
195
196 parser = pub fn parse_reltype;
197}
198
199define_param_enum_with_unknown! {
200 #[derive(Default)]
201 pub enum ParticipationRole {
202 Chair => KW_ROLE_CHAIR,
203 #[default]
204 ReqParticipant => KW_ROLE_REQ_PARTICIPANT,
205 OptParticipant => KW_ROLE_OPT_PARTICIPANT,
206 NonParticipant => KW_ROLE_NON_PARTICIPANT,
207 }
208
209 parser = pub fn parse_role;
210}
211
212define_param_enum_with_unknown! {
213 pub enum ValueType {
214 Binary => KW_BINARY,
215 Boolean => KW_BOOLEAN,
216 CalendarUserAddress => KW_CAL_ADDRESS,
217 Date => KW_DATE,
218 DateTime => KW_DATETIME,
219 Duration => KW_DURATION,
220 Float => KW_FLOAT,
221 Integer => KW_INTEGER,
222 Period => KW_PERIOD,
223 RecurrenceRule => KW_RRULE,
224 Text => KW_TEXT,
225 Time => KW_TIME,
226 Uri => KW_URI,
227 UtcOffset => KW_UTC_OFFSET,
228 }
229
230 parser = pub fn parse_value_type;
231 gen_eq_known;
232}
233
234impl<S: StringStorage> From<ValueType<&S>> for ValueType<S> {
235 fn from(value: ValueType<&S>) -> Self {
236 match value {
237 ValueType::Binary => ValueType::Binary,
238 ValueType::Boolean => ValueType::Boolean,
239 ValueType::CalendarUserAddress => ValueType::CalendarUserAddress,
240 ValueType::Date => ValueType::Date,
241 ValueType::DateTime => ValueType::DateTime,
242 ValueType::Duration => ValueType::Duration,
243 ValueType::Float => ValueType::Float,
244 ValueType::Integer => ValueType::Integer,
245 ValueType::Period => ValueType::Period,
246 ValueType::RecurrenceRule => ValueType::RecurrenceRule,
247 ValueType::Text => ValueType::Text,
248 ValueType::Time => ValueType::Time,
249 ValueType::Uri => ValueType::Uri,
250 ValueType::UtcOffset => ValueType::UtcOffset,
251 ValueType::XName(v) => ValueType::XName(v.to_owned()),
252 ValueType::Unrecognized(v) => ValueType::Unrecognized(v.to_owned()),
253 }
254 }
255}