Skip to main content

caldir_core/event/attendee/
participation_status.rs

1use std::fmt;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize)]
4#[serde(rename_all = "snake_case")]
5pub enum ParticipationStatus {
6    Accepted,
7    Declined,
8    Tentative,
9    NeedsAction,
10}
11
12impl fmt::Display for ParticipationStatus {
13    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
14        let s = match self {
15            Self::Accepted => "accepted",
16            Self::Declined => "declined",
17            Self::Tentative => "maybe",
18            Self::NeedsAction => "pending",
19        };
20        write!(f, "{}", s)
21    }
22}
23
24impl ParticipationStatus {
25    pub fn as_ics_str(&self) -> &'static str {
26        match self {
27            Self::Accepted => "ACCEPTED",
28            Self::Declined => "DECLINED",
29            Self::Tentative => "TENTATIVE",
30            Self::NeedsAction => "NEEDS-ACTION",
31        }
32    }
33
34    pub fn from_ics_str(s: &str) -> Option<Self> {
35        match s {
36            "ACCEPTED" => Some(Self::Accepted),
37            "DECLINED" => Some(Self::Declined),
38            "TENTATIVE" => Some(Self::Tentative),
39            "NEEDS-ACTION" => Some(Self::NeedsAction),
40            _ => None,
41        }
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn maps_to_rfc5545_strings() {
51        assert_eq!(ParticipationStatus::Accepted.as_ics_str(), "ACCEPTED");
52        assert_eq!(ParticipationStatus::Declined.as_ics_str(), "DECLINED");
53        assert_eq!(ParticipationStatus::Tentative.as_ics_str(), "TENTATIVE");
54        assert_eq!(
55            ParticipationStatus::NeedsAction.as_ics_str(),
56            "NEEDS-ACTION"
57        );
58    }
59
60    #[test]
61    fn parses_each_rfc5545_string() {
62        assert_eq!(
63            ParticipationStatus::from_ics_str("ACCEPTED"),
64            Some(ParticipationStatus::Accepted)
65        );
66        assert_eq!(
67            ParticipationStatus::from_ics_str("DECLINED"),
68            Some(ParticipationStatus::Declined)
69        );
70        assert_eq!(
71            ParticipationStatus::from_ics_str("TENTATIVE"),
72            Some(ParticipationStatus::Tentative)
73        );
74        assert_eq!(
75            ParticipationStatus::from_ics_str("NEEDS-ACTION"),
76            Some(ParticipationStatus::NeedsAction)
77        );
78    }
79
80    #[test]
81    fn unknown_strings_return_none() {
82        assert_eq!(ParticipationStatus::from_ics_str("DELEGATED"), None);
83        assert_eq!(ParticipationStatus::from_ics_str("accepted"), None);
84        assert_eq!(ParticipationStatus::from_ics_str(""), None);
85    }
86}