icalendar/value_types.rs
1use std::str::FromStr;
2
3use crate::Parameter;
4
5/// see 8.3.4. [Value Data Types Registry](https://tools.ietf.org/html/rfc5545#section-8.3.4)
6#[derive(Copy, Clone, Debug, Eq, PartialEq)]
7pub enum ValueType {
8 /// [`Binary`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.1)
9 Binary,
10 /// [`Boolean`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.2)
11 Boolean,
12 /// [`CalAddress`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.3)
13 CalAddress,
14 /// [`Date`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.4)
15 Date,
16 /// [`DateTime`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.5)
17 DateTime,
18 /// [`Duration`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.6)
19 Duration,
20 /// [`Float`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.7)
21 Float,
22 /// [`Integer`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.8)
23 Integer,
24 /// [`Period`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.9)
25 Period,
26 /// [`Recur`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.10)
27 Recur,
28 /// [`Text`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.11)
29 Text,
30 /// [`Time`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.12)
31 Time,
32 /// [`Uri`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.13)
33 Uri,
34 /// [`UtcOffset`](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.14)
35 UtcOffset,
36}
37
38impl ValueType {
39 pub(crate) fn by_name(name: &str) -> Option<Self> {
40 if name.chars().any(char::is_lowercase) {
41 // eprintln!("property_name must be uppercase");
42 return None;
43 }
44 use ValueType::*;
45 match name {
46 // 3.7.0 calendar properties
47 "CALSCALE" => Some(Text), // 3.7.1
48 "METHOD" => Some(Text), // 3.7.2
49 "PRODID" => Some(Text), // 3.7.3
50 "VERSION" => Some(Text), //3.7.4
51
52 // 3.8.0 component properties
53 "ATTACH" => Some(Uri), // or BINARY // 3.8.1.1
54 "CATEGORIES" => Some(Text), // 3.8.1.2
55 "CLASS" => Some(Text), // 3.8.1.3
56 "COMMENT" => Some(Text), // 3.8.1.4
57 "DESCRIPTION" => Some(Text), // 3.8.1.5
58 "GEO" => Some(Float), // 3.8.1.6
59 "LOCATION" => Some(Text), // 3.8.1.7
60 "PERCENT-COMPLETE" => Some(Integer), // 3.8.1.8
61 "PRIORITY" => Some(Integer), // 3.8.1.9
62 "RESOURCES" => Some(Text), // 3.8.1.10
63 "STATUS" => Some(Text), // 3.8.1.11
64 "SUMMARY" => Some(Text), // 3.8.8.1.12
65 "COMPLETED" => Some(DateTime), // 3.8.2.1
66 "DTEND" => Some(DateTime), // or DATE // 3.8.2.2
67 "DUE" => Some(DateTime), // or DATE // 3.8.2.3
68 "DTSTART" => Some(DateTime), // or DATE 3.8.2.4
69 "DURATION" => Some(Duration), // 3.8.2.5
70 "FREEBUSY" => Some(Period), // 3.8.2.6
71 "TRANSP" => Some(Text), // 3.8.2.7
72 "TZID" => Some(Text), // 3.8.3.1
73 "TZNAME" => Some(Text), // 3.8.3.2
74 "TZOFFSETFROM" => Some(UtcOffset), //
75 "TZOFFSETTO" => Some(UtcOffset), //
76 "TZURL" => Some(Uri), //
77 "ATTENDEE" => Some(CalAddress), // 3.8.4.1
78 "CONTACT" => Some(Text), // 3.8.4.2
79 "ORGANIZER" => Some(CalAddress), // 3.8.4.3
80 "RECURRENCE-ID" => Some(DateTime), // 3.8.4.4
81 "RELATED-TO" => Some(Text), //
82 "URL" => Some(Uri), //
83 "UID" => Some(Text), //
84 "EXDATE" => Some(DateTime), // or DATE-TIME //
85 "RDATE" => Some(DateTime), // or PERIOD // or DATE-TIME // or DATE //
86 "RRULE" => Some(Recur), //
87 "ACTION" => Some(Text), //
88 "REPEAT" => Some(Integer), //
89 "TRIGGER" => Some(Duration), // or DATE-TIME (must be UTC) // 3.8.6.3
90 "CREATED" => Some(DateTime), // 3.8.7.1
91 "DTSTAMP" => Some(DateTime), // 3.8.7.2
92 "LAST-MODIFIED" => Some(DateTime), // 3.8.7.3
93 "SEQUENCE" => Some(Integer), // 3.8.7.4
94 // 3.8.8.1
95 // "An IANA-registered property name" => Any parameter can be specified on this property.
96 // "X-"/* ... */ => Some(Text), // any type 3.8.8.2
97 "REQUEST-STATUS" => Some(Text), // 3.8.8.3
98 _ => None,
99 }
100 }
101}
102
103impl TryFrom<Parameter> for ValueType {
104 type Error = ();
105
106 fn try_from(par: Parameter) -> Result<Self, Self::Error> {
107 if par.key() != "VALUE" {
108 Err(())
109 } else {
110 FromStr::from_str(par.value())
111 }
112 }
113}
114
115impl FromStr for ValueType {
116 type Err = ();
117
118 fn from_str(val: &str) -> Result<Self, Self::Err> {
119 match val {
120 "BINARY" => Ok(Self::Binary),
121 "BOOLEAN" => Ok(Self::Boolean),
122 "CAL-ADDRESS" => Ok(Self::CalAddress),
123 "DATE" => Ok(Self::Date),
124 "DATE-TIME" => Ok(Self::DateTime),
125 "DURATION" => Ok(Self::Duration),
126 "FLOAT" => Ok(Self::Float),
127 "INTEGER" => Ok(Self::Integer),
128 "PERIOD" => Ok(Self::Period),
129 "RECUR" => Ok(Self::Recur),
130 "TEXT" => Ok(Self::Text),
131 "TIME" => Ok(Self::Time),
132 "URI" => Ok(Self::Uri),
133 "UTC-OFFSET" => Ok(Self::UtcOffset),
134 _ => Err(()),
135 }
136 }
137}