email-lib 0.27.0

Cross-platform, asynchronous Rust library to manage emails
Documentation
use async_trait::async_trait;

use super::DeleteFolder;
use crate::{
    folder::{error::Error, FolderKind},
    maildir::MaildirContextSync,
    AnyResult,
};

pub struct DeleteMaildirFolder {
    ctx: MaildirContextSync,
}

impl DeleteMaildirFolder {
    pub fn new(ctx: &MaildirContextSync) -> Self {
        Self { ctx: ctx.clone() }
    }

    pub fn new_boxed(ctx: &MaildirContextSync) -> Box<dyn DeleteFolder> {
        Box::new(Self::new(ctx))
    }

    pub fn some_new_boxed(ctx: &MaildirContextSync) -> Option<Box<dyn DeleteFolder>> {
        Some(Self::new_boxed(ctx))
    }
}

#[async_trait]
impl DeleteFolder for DeleteMaildirFolder {
    async fn delete_folder(&self, folder: &str) -> AnyResult<()> {
        let ctx = self.ctx.lock().await;
        let config = &ctx.account_config;
        let maildirpp = ctx.maildir_config.maildirpp;

        let folder = config.get_folder_alias(folder);

        if maildirpp && FolderKind::matches_inbox(&folder) {
            let path = ctx.root.path().to_owned();
            return Err(Error::DeleteMaildirInboxForbiddenError(path).into());
        }

        ctx.root
            .remove(&folder)
            .map_err(|err| Error::DeleteMaildirFolderError(err, folder))?;

        Ok(())
    }
}