email/folder/expunge/
maildir.rs

1use async_trait::async_trait;
2use tracing::info;
3
4use super::ExpungeFolder;
5use crate::{folder::error::Error, maildir::MaildirContextSync, AnyResult};
6
7pub struct ExpungeMaildirFolder {
8    ctx: MaildirContextSync,
9}
10
11impl ExpungeMaildirFolder {
12    pub fn new(ctx: &MaildirContextSync) -> Self {
13        Self { ctx: ctx.clone() }
14    }
15
16    pub fn new_boxed(ctx: &MaildirContextSync) -> Box<dyn ExpungeFolder> {
17        Box::new(Self::new(ctx))
18    }
19
20    pub fn some_new_boxed(ctx: &MaildirContextSync) -> Option<Box<dyn ExpungeFolder>> {
21        Some(Self::new_boxed(ctx))
22    }
23}
24
25#[async_trait]
26impl ExpungeFolder for ExpungeMaildirFolder {
27    async fn expunge_folder(&self, folder: &str) -> AnyResult<()> {
28        info!("expunging maildir folder {folder}");
29
30        let ctx = self.ctx.lock().await;
31        let mdir = ctx.get_maildir_from_folder_alias(folder)?;
32
33        let entries = mdir
34            .read()
35            .map_err(|err| Error::ListCurrentFolderMaildirError(err, mdir.path().to_owned()))?;
36
37        entries
38            .filter(|entry| entry.has_trash_flag())
39            .try_for_each(|entry| {
40                entry
41                    .remove()
42                    .map_err(|err| Error::RemoveMaildirEntryError(err, entry.path().to_owned()))
43            })?;
44
45        Ok(())
46    }
47}