email/email/envelope/flag/set/
maildir.rs

1use std::collections::HashSet;
2
3use async_trait::async_trait;
4use tracing::info;
5
6use super::{Flags, SetFlags};
7use crate::{email::error::Error, envelope::Id, maildir::MaildirContextSync, AnyResult};
8
9#[derive(Clone)]
10pub struct SetMaildirFlags {
11    ctx: MaildirContextSync,
12}
13
14impl SetMaildirFlags {
15    pub fn new(ctx: &MaildirContextSync) -> Self {
16        Self { ctx: ctx.clone() }
17    }
18
19    pub fn new_boxed(ctx: &MaildirContextSync) -> Box<dyn SetFlags> {
20        Box::new(Self::new(ctx))
21    }
22
23    pub fn some_new_boxed(ctx: &MaildirContextSync) -> Option<Box<dyn SetFlags>> {
24        Some(Self::new_boxed(ctx))
25    }
26}
27
28#[async_trait]
29impl SetFlags for SetMaildirFlags {
30    async fn set_flags(&self, folder: &str, id: &Id, flags: &Flags) -> AnyResult<()> {
31        info!("setting maildir flag(s) {flags} to envelope {id} from folder {folder}");
32
33        let ctx = self.ctx.lock().await;
34        let mdir = ctx.get_maildir_from_folder_alias(folder)?;
35
36        id.iter()
37            .filter_map(|id| mdir.find(id).ok().flatten())
38            .try_for_each(|mut entry| {
39                entry.update_flags(HashSet::from(flags)).map_err(|err| {
40                    Error::SetFlagsMaildirError(
41                        err,
42                        folder.to_owned(),
43                        id.to_string(),
44                        flags.clone(),
45                    )
46                })
47            })?;
48
49        Ok(())
50    }
51}