diff --git a/melib/src/backends.rs b/melib/src/backends.rs
index a72a3e35c..c571fbca3 100644
--- a/melib/src/backends.rs
+++ b/melib/src/backends.rs
@@ -18,6 +18,16 @@
* You should have received a copy of the GNU General Public License
* along with meli. If not, see .
*/
+
+#[macro_export]
+macro_rules! tag_hash {
+ ($tag:ident) => {{
+ let mut hasher = DefaultHasher::new();
+ hasher.write($tag.as_bytes());
+ hasher.finish()
+ }};
+}
+
#[cfg(feature = "imap_backend")]
pub mod imap;
#[cfg(feature = "maildir_backend")]
@@ -288,6 +298,7 @@ pub trait BackendOp: ::std::fmt::Debug + ::std::marker::Send {
//fn copy(&self
fn fetch_flags(&self) -> Flag;
fn set_flag(&mut self, envelope: &mut Envelope, flag: Flag, value: bool) -> Result<()>;
+ fn set_tag(&mut self, envelope: &mut Envelope, tag: String, value: bool) -> Result<()>;
}
/// Wrapper for BackendOps that are to be set read-only.
@@ -318,6 +329,9 @@ impl BackendOp for ReadOnlyOp {
fn set_flag(&mut self, _envelope: &mut Envelope, _flag: Flag, _value: bool) -> Result<()> {
Err(MeliError::new("read-only set."))
}
+ fn set_tag(&mut self, _envelope: &mut Envelope, _tag: String, _value: bool) -> Result<()> {
+ Err(MeliError::new("read-only set."))
+ }
}
#[derive(Debug, Copy, Hash, Eq, Clone, Serialize, Deserialize, PartialEq)]
diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs
index e349b2c86..ea2a66007 100644
--- a/melib/src/backends/imap.rs
+++ b/melib/src/backends/imap.rs
@@ -153,6 +153,7 @@ impl MailBackend for ImapType {
let handle = {
let tx = w.tx();
let uid_store = self.uid_store.clone();
+ let tag_index = self.tag_index.clone();
let can_create_flags = self.can_create_flags.clone();
let folder_path = folder.path().to_string();
let folder_hash = folder.hash();
@@ -209,6 +210,7 @@ impl MailBackend for ImapType {
conn.read_response(&mut response)
);
+ let mut tag_lck = tag_index.write().unwrap();
while exists > 1 {
let mut envelopes = vec![];
exit_on_error!(&tx,
@@ -231,8 +233,15 @@ impl MailBackend for ImapType {
h.write_usize(uid);
h.write(folder_path.as_bytes());
env.set_hash(h.finish());
- if let Some(flags) = flags {
+ if let Some((flags, keywords)) = flags {
env.set_flags(flags);
+ for f in keywords {
+ let hash = tag_hash!(f);
+ if !tag_lck.contains_key(&hash) {
+ tag_lck.insert(hash, f);
+ }
+ env.labels_mut().push(hash);
+ }
}
uid_store
.hash_index
@@ -272,6 +281,7 @@ impl MailBackend for ImapType {
.capabilities
.contains(&b"IDLE"[0..]);
let folders = self.folders.clone();
+ let tag_index = self.tag_index.clone();
let conn = ImapConnection::new_connection(&self.server_conf);
let main_conn = self.connection.clone();
let is_online = self.online.clone();
@@ -292,6 +302,7 @@ impl MailBackend for ImapType {
folders,
sender,
work_context,
+ tag_index,
};
if has_idle {
idle(kit).ok().take();
@@ -338,6 +349,7 @@ impl MailBackend for ImapType {
.to_string(),
self.connection.clone(),
self.uid_store.clone(),
+ self.tag_index.clone(),
))
}
diff --git a/melib/src/backends/imap/operations.rs b/melib/src/backends/imap/operations.rs
index ed7b43f0e..10aab9aa9 100644
--- a/melib/src/backends/imap/operations.rs
+++ b/melib/src/backends/imap/operations.rs
@@ -38,6 +38,7 @@ pub struct ImapOp {
flags: Cell