email/email/message/remove/
maildir.rs

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