use clap::{Parser, Subcommand};
use crate::commands::{
ApplyCmd, BrewBackupCmd, BrewInstallCmd, CheckUpdateCmd, CompletionCmd, ConfigCmd, CookbookCmd,
ExecCmd, FetchCmd, InitCmd, LockCmd, ResetCmd, Runnable, SelfUpdateCmd, StatusCmd, UnapplyCmd,
UnlockCmd,
};
#[derive(Parser)]
#[command(
name = "cutler",
version,
about,
help_template = "\
{name} {version}
{about}
usage
{usage}
options:
{options}
subcmds:
{subcommands}
For more information on a subcommand, run `{name} <subcommand> --help`
"
)]
pub struct Args {
#[arg(short, long, global = true)]
pub verbose: bool,
#[arg(long, global = true)]
pub quiet: bool,
#[arg(short = 'N', long, global = true)]
pub no_restart_services: bool,
#[arg(long, global = true)]
pub no_sync: bool,
#[arg(long, global = true)]
pub dry_run: bool,
#[arg(short = 'y', long, global = true)]
pub accept_all: bool,
#[command(subcommand)]
pub command: Command,
}
#[derive(Subcommand, Debug)]
pub enum Command {
#[command(visible_alias = "set")]
Apply(ApplyCmd),
#[command(visible_alias = "doc")]
Cookbook(CookbookCmd),
#[command(visible_alias = "x")]
Exec(ExecCmd),
Init(InitCmd),
Lock(LockCmd),
Unlock(UnlockCmd),
#[command(visible_alias = "undo")]
Unapply(UnapplyCmd),
Reset(ResetCmd),
#[command(visible_alias = "s")]
Status(StatusCmd),
Brew {
#[command(subcommand)]
command: BrewSubcmd,
},
#[command(visible_alias = "conf")]
Config(ConfigCmd),
#[command(visible_alias = "cup")]
CheckUpdate(CheckUpdateCmd),
#[command(visible_alias = "sup")]
SelfUpdate(SelfUpdateCmd),
#[command(visible_alias = "comp")]
Completion(CompletionCmd),
#[command(visible_alias = "get")]
Fetch(FetchCmd),
}
#[derive(Subcommand, Debug)]
pub enum BrewSubcmd {
Backup(BrewBackupCmd),
#[command(visible_alias = "apply")]
Install(BrewInstallCmd),
}
impl Command {
#[must_use]
pub fn as_runnable(&self) -> &dyn Runnable {
match self {
Self::Apply(cmd) => cmd,
Self::Config(cmd) => cmd,
Self::Cookbook(cmd) => cmd,
Self::Exec(cmd) => cmd,
Self::Fetch(cmd) => cmd,
Self::Init(cmd) => cmd,
Self::Unapply(cmd) => cmd,
Self::Reset(cmd) => cmd,
Self::Status(cmd) => cmd,
Self::Lock(cmd) => cmd,
Self::Unlock(cmd) => cmd,
Self::CheckUpdate(cmd) => cmd,
Self::SelfUpdate(cmd) => cmd,
Self::Completion(cmd) => cmd,
Self::Brew { command } => match command {
BrewSubcmd::Backup(cmd) => cmd as &dyn Runnable,
BrewSubcmd::Install(cmd) => cmd as &dyn Runnable,
},
}
}
}