caldir_core/event/attendee/
participation_status.rs1use 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}