email/email/message/remove/
maildir.rs1use 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}