imap-tools 1.8.2

A collection of tools to manipulate IMAP mailboxes
use clap::Subcommand;
use derive_more::Display;
use exn::{Result, ResultExt as _};
mod create;
mod delete;
mod disk_usage;
mod list;

#[derive(Subcommand, Debug, Clone)]
pub enum ImapCommands {
    #[command(aliases = &["ls"])]
    List(list::List),

    #[command(aliases = &["mkdir"])]
    Create(create::Create),

    #[command(aliases = &["rmdir"])]
    Delete(delete::Delete),

    #[command(aliases = &["du"])]
    DiskUsage(disk_usage::DiskUsage),
}

#[derive(Debug, Display)]
pub struct ImapCommandsError(&'static str);
impl std::error::Error for ImapCommandsError {}

impl ImapCommands {
    #[cfg_attr(
        feature = "tracing",
        tracing::instrument(level = "trace", skip(self), err(level = "info"))
    )]
    pub fn execute(&self) -> Result<(), ImapCommandsError> {
        match *self {
            Self::List(ref list) => list.execute().or_raise(|| ImapCommandsError("list")),
            Self::Create(ref create) => create.execute().or_raise(|| ImapCommandsError("create")),
            Self::Delete(ref delete) => delete.execute().or_raise(|| ImapCommandsError("delete")),
            Self::DiskUsage(ref du) => du.execute().or_raise(|| ImapCommandsError("du")),
        }
    }
}