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 archive;
mod clean;
mod find_dups;
mod imap;
mod list;

#[derive(Subcommand, Debug, Clone)]
pub enum MainCommands {
    #[command(aliases = &["move"])]
    Archive(archive::Archive),

    #[command(aliases = &["cleanup"])]
    Clean(clean::Clean),

    #[command(aliases = &["find-dup", "findDup", "findDups", "finddup", "finddups"])]
    FindDups(find_dups::FindDups),

    #[command(aliases = &["ls"])]
    List(list::List),

    #[command(subcommand)]
    Imap(imap::ImapCommands),
}

#[derive(Debug, Display)]
pub struct MainCommandError(&'static str);

impl std::error::Error for MainCommandError {}

impl MainCommands {
    #[cfg_attr(
        feature = "tracing",
        tracing::instrument(level = "trace", skip(self), err(level = "info"))
    )]
    pub fn execute(&self) -> Result<(), MainCommandError> {
        match *self {
            Self::Archive(ref archive) => {
                archive.execute().or_raise(|| MainCommandError("archive"))
            }
            Self::Clean(ref clean) => clean.execute().or_raise(|| MainCommandError("clean")),
            Self::FindDups(ref find_dups) => find_dups
                .execute()
                .or_raise(|| MainCommandError("find-dups")),
            Self::List(ref list) => list.execute().or_raise(|| MainCommandError("list")),
            Self::Imap(ref imap) => imap.execute().or_raise(|| MainCommandError("imap")),
        }
    }
}