caldir_core/event/
visibility.rs1use std::fmt;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize)]
4#[serde(rename_all = "snake_case")]
5pub enum Visibility {
6 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 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}