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}