email/folder/delete/
maildir.rs1use 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}