email/email/envelope/flag/set/
maildir.rs1use 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}