1use std::fmt;
2
3#[derive(Debug, Clone, PartialEq, Eq)]
4pub enum Flag {
5 Seen,
6 Answered,
7 Flagged,
8 Deleted,
9 Draft,
10 Recent,
11 Custom(String),
12}
13
14impl fmt::Display for Flag {
15 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
16 match self {
17 Flag::Seen => write!(f, "\\Seen"),
18 Flag::Answered => write!(f, "\\Answered"),
19 Flag::Flagged => write!(f, "\\Flagged"),
20 Flag::Deleted => write!(f, "\\Deleted"),
21 Flag::Draft => write!(f, "\\Draft"),
22 Flag::Recent => write!(f, "\\Recent"),
23 Flag::Custom(s) => write!(f, "{}", s),
24 }
25 }
26}
27
28#[derive(Debug, Clone, PartialEq, Eq)]
29pub enum StoreAction {
30 Add,
31 Remove,
32 Set,
33}
34
35impl StoreAction {
36 pub fn to_imap_prefix(&self, silent: bool) -> &str {
37 match self {
38 StoreAction::Add => {
39 if silent {
40 "+FLAGS.SILENT"
41 } else {
42 "+FLAGS"
43 }
44 }
45 StoreAction::Remove => {
46 if silent {
47 "-FLAGS.SILENT"
48 } else {
49 "-FLAGS"
50 }
51 }
52 StoreAction::Set => {
53 if silent {
54 "FLAGS.SILENT"
55 } else {
56 "FLAGS"
57 }
58 }
59 }
60 }
61}
62
63#[cfg(test)]
64mod tests {
65 use super::*;
66
67 #[test]
68 fn test_flag_display() {
69 assert_eq!(Flag::Seen.to_string(), "\\Seen");
70 assert_eq!(Flag::Answered.to_string(), "\\Answered");
71 assert_eq!(Flag::Flagged.to_string(), "\\Flagged");
72 assert_eq!(Flag::Deleted.to_string(), "\\Deleted");
73 assert_eq!(Flag::Draft.to_string(), "\\Draft");
74 assert_eq!(Flag::Recent.to_string(), "\\Recent");
75 assert_eq!(Flag::Custom("MyFlag".into()).to_string(), "MyFlag");
76 }
77
78 #[test]
79 fn test_store_action_prefix() {
80 assert_eq!(StoreAction::Add.to_imap_prefix(false), "+FLAGS");
81 assert_eq!(StoreAction::Add.to_imap_prefix(true), "+FLAGS.SILENT");
82 assert_eq!(StoreAction::Remove.to_imap_prefix(false), "-FLAGS");
83 assert_eq!(StoreAction::Remove.to_imap_prefix(true), "-FLAGS.SILENT");
84 assert_eq!(StoreAction::Set.to_imap_prefix(false), "FLAGS");
85 assert_eq!(StoreAction::Set.to_imap_prefix(true), "FLAGS.SILENT");
86 }
87}