Skip to main content

caldir_core/event/
visibility.rs

1use std::fmt;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize)]
4#[serde(rename_all = "snake_case")]
5pub enum Visibility {
6    // RFC 5545 CLASS values. Absent CLASS maps to `None`, so no Default here.
7    Public,
8    Private,
9    Confidential,
10}
11
12impl fmt::Display for Visibility {
13    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
14        let s = match self {
15            Self::Public => "public",
16            Self::Private => "private",
17            Self::Confidential => "confidential",
18        };
19        write!(f, "{}", s)
20    }
21}
22
23impl Visibility {
24    pub fn as_ics_str(&self) -> &'static str {
25        match self {
26            Self::Public => "PUBLIC",
27            Self::Private => "PRIVATE",
28            Self::Confidential => "CONFIDENTIAL",
29        }
30    }
31
32    pub fn from_ics_str(s: &str) -> Option<Self> {
33        match s {
34            "PUBLIC" => Some(Self::Public),
35            "PRIVATE" => Some(Self::Private),
36            "CONFIDENTIAL" => Some(Self::Confidential),
37            _ => None,
38        }
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn maps_to_rfc5545_strings() {
48        assert_eq!(Visibility::Public.as_ics_str(), "PUBLIC");
49        assert_eq!(Visibility::Private.as_ics_str(), "PRIVATE");
50        assert_eq!(Visibility::Confidential.as_ics_str(), "CONFIDENTIAL");
51    }
52
53    #[test]
54    fn parses_each_rfc5545_string() {
55        assert_eq!(Visibility::from_ics_str("PUBLIC"), Some(Visibility::Public));
56        assert_eq!(
57            Visibility::from_ics_str("PRIVATE"),
58            Some(Visibility::Private)
59        );
60        assert_eq!(
61            Visibility::from_ics_str("CONFIDENTIAL"),
62            Some(Visibility::Confidential)
63        );
64    }
65
66    #[test]
67    fn unknown_strings_return_none() {
68        // RFC 5545 permits implementation-defined CLASS values; we treat any
69        // value we don't recognize as the default (PUBLIC) at the call site,
70        // so `from_ics_str` reports unknown explicitly via `None`.
71        assert_eq!(Visibility::from_ics_str("SECRET"), None);
72        assert_eq!(Visibility::from_ics_str("private"), None);
73        assert_eq!(Visibility::from_ics_str(""), None);
74    }
75
76    #[test]
77    fn display_uses_lowercase_label() {
78        assert_eq!(Visibility::Public.to_string(), "public");
79        assert_eq!(Visibility::Private.to_string(), "private");
80        assert_eq!(Visibility::Confidential.to_string(), "confidential");
81    }
82}