use std::path::PathBuf;
use clap::ArgAction;
use clap::ArgGroup;
use clap::Parser;
use clap::Subcommand;
#[cfg(feature = "with_subcommand_generate_shell_completions")]
use crate::git_gamble::subcommand_generate_shell_completions::cli::GenerateShellCompletions;
#[cfg(feature = "with_subcommand_hook")]
use crate::git_gamble::subcommand_hook::cli::SubCommandHook;
#[derive(Subcommand, Debug)]
pub enum OptionalSubcommands {
#[cfg(feature = "with_subcommand_generate_shell_completions")]
GenerateShellCompletions(GenerateShellCompletions),
#[cfg(feature = "with_subcommand_hook")]
#[command(subcommand)]
Hook(SubCommandHook),
}
#[derive(Parser, Debug)]
#[command(
version,
infer_subcommands = true,
subcommand_negates_reqs = true,
group = ArgGroup::new("gambling").required(true),
about(
[
"Blend TDD (Test Driven Development) + TCR (`test && commit || revert`) to make sure to develop",
"the right thing π, baby step by baby step πΆπ¦Ά"
].join("\n")
),
after_help(
[
"Any contributions (feedback, bug report, merge request ...) are welcome",
"https://git-gamble.is-cool.dev/contributing/index.html"
].join("\n")
)
)]
pub struct Cli {
#[command(subcommand)]
pub optional_subcommands: Option<OptionalSubcommands>,
#[arg(
short = 'g',
long,
group = "gambling",
visible_aliases = &["green", "refactor"],
display_order = 1,
)]
pub pass: bool,
#[arg(
short = 'r',
long,
group = "gambling",
visible_alias = "red",
display_order = 1
)]
pub fail: bool,
#[arg(short = 'n', long)]
pub dry_run: bool,
#[arg(long)]
pub no_verify: bool,
#[arg(short = 'C', long, default_value = ".")]
pub repository_path: PathBuf,
#[arg(short = 'm', long, default_value = "")]
pub message: String,
#[arg(short = 'e', long)]
pub edit: bool,
#[arg(long, group = "rebase-message")]
pub fixup: Option<String>,
#[arg(long, group = "rebase-message")]
pub squash: Option<String>,
#[arg(
env = "GAMBLE_TEST_COMMAND",
action(ArgAction::Append),
last = true,
required = true
)]
pub test_command: Vec<String>,
}
#[test]
fn verify_app() {
use clap::CommandFactory;
Cli::command().debug_assert()
}