cull_gmail/retention/
message_age.rs

1use std::fmt::Display;
2
3/// Message age
4#[derive(Debug)]
5pub enum MessageAge {
6    /// Number of days to retain the message
7    Days(i64),
8    /// Number of weeks to retain the message
9    Weeks(i64),
10    /// Number of months to retain the message
11    Months(i64),
12    /// Number of years to retain the message
13    Years(i64),
14}
15
16impl Display for MessageAge {
17    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18        match self {
19            MessageAge::Days(v) => write!(f, "d:{v}"),
20            MessageAge::Weeks(v) => write!(f, "w:{v}"),
21            MessageAge::Months(v) => write!(f, "m:{v}"),
22            MessageAge::Years(v) => write!(f, "y:{v}"),
23        }
24    }
25}
26
27impl MessageAge {
28    /// Create a new MessageAge enum
29    pub fn new(period: &str, count: i64) -> Self {
30        match period.to_lowercase().as_str() {
31            "days" => MessageAge::Days(count),
32            "weeks" => MessageAge::Weeks(count),
33            "months" => MessageAge::Months(count),
34            "years" => MessageAge::Years(count),
35            _ => unreachable!(),
36        }
37    }
38
39    pub(crate) fn parse(str: &str) -> Option<MessageAge> {
40        let period = str.chars().nth(0).unwrap_or('x');
41        let count = str[2..].to_string().parse::<i64>().unwrap_or(0);
42
43        match period {
44            'd' => Some(MessageAge::Days(count)),
45            'w' => Some(MessageAge::Weeks(count)),
46            'm' => Some(MessageAge::Months(count)),
47            'y' => Some(MessageAge::Years(count)),
48            _ => None,
49        }
50    }
51
52    pub(crate) fn label(&self) -> String {
53        match self {
54            MessageAge::Days(v) => format!("retention/{v}-days"),
55            MessageAge::Weeks(v) => format!("retention/{v}-weeks"),
56            MessageAge::Months(v) => format!("retention/{v}-months"),
57            MessageAge::Years(v) => format!("retention/{v}-years"),
58        }
59    }
60}