From f8833ccd7c516086bfeda54a2c4d451a94ce2b9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20DOUIN?= Date: Wed, 10 Mar 2021 18:05:26 +0100 Subject: [PATCH] add basic flags --- src/imap.rs | 2 +- src/msg.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/imap.rs b/src/imap.rs index 804dec0e..4f9e6a2c 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -116,7 +116,7 @@ impl<'a> ImapConnector<'a> { let msgs = self .sess - .fetch(range, "(UID ENVELOPE INTERNALDATE)")? + .fetch(range, "(UID FLAGS ENVELOPE INTERNALDATE)")? .iter() .rev() .map(Msg::from) diff --git a/src/msg.rs b/src/msg.rs index 5a340ad0..b7dfbad0 100644 --- a/src/msg.rs +++ b/src/msg.rs @@ -196,9 +196,29 @@ impl<'a> ReadableMsg { // Message +#[derive(Debug, Serialize)] +#[serde(rename_all = "lowercase")] +pub enum Flag { + Seen, + Answered, + Flagged, +} + +impl Flag { + fn from_imap_flag(flag: &imap::types::Flag<'_>) -> Option { + match flag { + imap::types::Flag::Seen => Some(Self::Seen), + imap::types::Flag::Answered => Some(Self::Answered), + imap::types::Flag::Flagged => Some(Self::Flagged), + _ => None, + } + } +} + #[derive(Debug, Serialize)] pub struct Msg { pub uid: u32, + pub flags: Vec, pub subject: String, pub sender: String, pub date: String, @@ -211,6 +231,7 @@ impl From> for Msg { fn from(raw: Vec) -> Self { Self { uid: 0, + flags: vec![], subject: String::from(""), sender: String::from(""), date: String::from(""), @@ -231,6 +252,11 @@ impl From<&imap::types::Fetch> for Msg { None => Self::from(fetch.body().unwrap_or_default().to_vec()), Some(envelope) => Self { uid: fetch.uid.unwrap_or_default(), + flags: fetch + .flags() + .into_iter() + .filter_map(Flag::from_imap_flag) + .collect::>(), subject: envelope .subject .and_then(|subj| rfc2047_decoder::decode(subj).ok())