use imap::types::Flag;
pub fn maildir_to_imap(flags: &'_ str) -> Vec<Flag> {
let mut result: Vec<Flag> = Vec::new();
for f in flags.chars() {
match f {
'R' => result.push(Flag::Answered),
'T' => result.push(Flag::Deleted),
'D' => result.push(Flag::Draft),
'F' => result.push(Flag::Flagged),
'S' => result.push(Flag::Seen),
_ => continue,
};
}
result
}
pub fn imap_to_maildir(flags: &[Flag<'_>]) -> String {
let mut fchars: Vec<char> = Vec::new();
for f in flags {
match f {
Flag::Answered => fchars.push('R'), Flag::Deleted => fchars.push('T'), Flag::Draft => fchars.push('D'),
Flag::Flagged => fchars.push('F'),
Flag::Seen => fchars.push('S'),
_ => (),
};
}
fchars.sort();
let result: String = fchars.into_iter().collect();
result
}
pub fn to_imap_list(flags: &[Flag<'_>]) -> String {
let list: Vec<String> = flags.iter().map(|f| format!("{}", f)).collect();
list.join(" ")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_flags() {
let imap = maildir_to_imap("RS");
assert_eq!(imap.as_slice(), [Flag::Answered, Flag::Seen]);
let imap_list = to_imap_list(&imap);
assert_eq!(&imap_list, "\\Answered \\Seen");
let maildir = imap_to_maildir(&imap);
assert_eq!(maildir, "RS");
}
#[test]
fn test_flags_sort() {
let imap = maildir_to_imap("SR");
assert_eq!(imap.as_slice(), [Flag::Seen, Flag::Answered]);
let maildir = imap_to_maildir(&imap);
assert_eq!(maildir, "RS");
}
}