use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Flag {
Seen,
Answered,
Flagged,
Deleted,
Draft,
Keyword(String),
}
impl Flag {
#[must_use]
pub fn as_imap_str(&self) -> &str {
match self {
Self::Seen => "\\Seen",
Self::Answered => "\\Answered",
Self::Flagged => "\\Flagged",
Self::Deleted => "\\Deleted",
Self::Draft => "\\Draft",
Self::Keyword(kw) => kw,
}
}
}
impl fmt::Display for Flag {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_imap_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn system_flags() {
assert_eq!(Flag::Seen.as_imap_str(), "\\Seen");
assert_eq!(Flag::Answered.as_imap_str(), "\\Answered");
assert_eq!(Flag::Flagged.as_imap_str(), "\\Flagged");
assert_eq!(Flag::Deleted.as_imap_str(), "\\Deleted");
assert_eq!(Flag::Draft.as_imap_str(), "\\Draft");
}
#[test]
fn keyword_flag() {
let kw = Flag::Keyword("$Important".to_string());
assert_eq!(kw.as_imap_str(), "$Important");
}
#[test]
fn display_matches_imap_str() {
assert_eq!(format!("{}", Flag::Seen), "\\Seen");
assert_eq!(format!("{}", Flag::Keyword("$Junk".to_string())), "$Junk");
}
}