email/folder/delete/
maildir.rs

1use async_trait::async_trait;
2
3use super::DeleteFolder;
4use crate::{
5    folder::{error::Error, FolderKind},
6    maildir::MaildirContextSync,
7    AnyResult,
8};
9
10pub struct DeleteMaildirFolder {
11    ctx: MaildirContextSync,
12}
13
14impl DeleteMaildirFolder {
15    pub fn new(ctx: &MaildirContextSync) -> Self {
16        Self { ctx: ctx.clone() }
17    }
18
19    pub fn new_boxed(ctx: &MaildirContextSync) -> Box<dyn DeleteFolder> {
20        Box::new(Self::new(ctx))
21    }
22
23    pub fn some_new_boxed(ctx: &MaildirContextSync) -> Option<Box<dyn DeleteFolder>> {
24        Some(Self::new_boxed(ctx))
25    }
26}
27
28#[async_trait]
29impl DeleteFolder for DeleteMaildirFolder {
30    async fn delete_folder(&self, folder: &str) -> AnyResult<()> {
31        let ctx = self.ctx.lock().await;
32        let config = &ctx.account_config;
33        let maildirpp = ctx.maildir_config.maildirpp;
34
35        let folder = config.get_folder_alias(folder);
36
37        if maildirpp && FolderKind::matches_inbox(&folder) {
38            let path = ctx.root.path().to_owned();
39            return Err(Error::DeleteMaildirInboxForbiddenError(path).into());
40        }
41
42        ctx.root
43            .remove(&folder)
44            .map_err(|err| Error::DeleteMaildirFolderError(err, folder))?;
45
46        Ok(())
47    }
48}