use std::path::PathBuf;
use clap::{Args, Parser, Subcommand, ValueEnum};
#[derive(Debug, Parser)]
#[command(name = "alba", version, about = "A task runner for Beamfiles")]
pub struct Cli {
#[arg(long, global = true, value_name = "PATH")]
pub file: Option<PathBuf>,
#[command(subcommand)]
pub command: Option<Command>,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Check,
Run {
#[arg(value_name = "BEAM")]
beam: Option<String>,
#[arg(value_name = "PARAM")]
params: Vec<String>,
#[command(flatten)]
flags: RunFlags,
},
Affected {
#[arg(value_name = "REF")]
reference: String,
#[arg(long, value_name = "FORMAT", value_enum, default_value_t = LogFormat::Text)]
log_format: LogFormat,
},
Cache {
#[command(subcommand)]
command: CacheCommand,
},
Plugin {
#[command(subcommand)]
command: PluginCommand,
},
#[command(hide = true)]
Hook {
#[arg(value_name = "NAME")]
name: String,
#[arg(
value_name = "ARG",
trailing_var_arg = true,
allow_hyphen_values = true
)]
args: Vec<String>,
},
Hooks {
#[command(subcommand)]
command: HooksCommand,
},
Update,
}
#[derive(Debug, Subcommand)]
pub enum HooksCommand {
Install,
Uninstall,
}
#[derive(Debug, Subcommand)]
pub enum CacheCommand {
Clean,
}
#[derive(Debug, Subcommand)]
pub enum PluginCommand {
Check {
#[arg(value_name = "BINARY")]
binary: PathBuf,
#[arg(long, value_name = "CMD", default_value = "echo alba-plugin-check")]
command: String,
#[arg(long, value_name = "CMD", default_value = "sleep 30000")]
cancel_command: String,
},
}
#[derive(Debug, Default, Args)]
pub struct RunFlags {
#[arg(long, value_name = "N", value_parser = clap::value_parser!(u64).range(1..))]
pub jobs: Option<u64>,
#[arg(long)]
pub keep_going: bool,
#[arg(long)]
pub force: bool,
#[arg(long, value_name = "STYLE", value_enum)]
pub output: Option<OutputStyle>,
#[arg(long, value_name = "FORMAT", value_enum, default_value_t = LogFormat::Text)]
pub log_format: LogFormat,
#[arg(long)]
pub watch: bool,
#[arg(long, value_name = "REF")]
pub affected: Option<String>,
#[arg(long, conflicts_with = "no_ui")]
pub ui: bool,
#[arg(long)]
pub no_ui: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum OutputStyle {
Interleaved,
Grouped,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, ValueEnum)]
pub enum LogFormat {
#[default]
Text,
Json,
}