vomit-sync 0.10.1

A library for IMAP to maildir synchronization
Documentation
use imap::types::Flag;

// pub fn imap_is_deleted<'a>(flags: &[Flag<'a>]) -> bool {
//     for flag in flags {
//         if *flag == Flag::Deleted {
//             return true;
//         }
//     }
//     false
// }

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'), // Replied
            Flag::Deleted => fchars.push('T'),  // Trashed
            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");
        // Sorting does not matter here
        assert_eq!(imap.as_slice(), [Flag::Seen, Flag::Answered]);

        // But it does for maildir
        let maildir = imap_to_maildir(&imap);
        assert_eq!(maildir, "RS");
    }
}