2023-09-07 11:49:43 +00:00
|
|
|
use clap::builder::PossibleValue;
|
2023-07-28 11:10:04 +00:00
|
|
|
#[cfg(feature = "unstable-dynamic")]
|
|
|
|
use clap::{FromArgMatches, Subcommand};
|
2023-07-20 02:54:00 +00:00
|
|
|
use clap_complete::{generate, Generator, Shell};
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let matches = cli().get_matches();
|
|
|
|
if let Some(generator) = matches.get_one::<Shell>("generate") {
|
|
|
|
let mut cmd = cli();
|
|
|
|
eprintln!("Generating completion file for {generator}...");
|
|
|
|
print_completions(*generator, &mut cmd);
|
2023-07-28 11:10:04 +00:00
|
|
|
return;
|
2023-07-20 02:54:00 +00:00
|
|
|
}
|
2023-07-28 11:10:04 +00:00
|
|
|
|
|
|
|
#[cfg(feature = "unstable-dynamic")]
|
|
|
|
if let Ok(completions) =
|
|
|
|
clap_complete::dynamic::shells::CompleteCommand::from_arg_matches(&matches)
|
|
|
|
{
|
|
|
|
completions.complete(&mut cli());
|
|
|
|
return;
|
|
|
|
};
|
|
|
|
|
|
|
|
println!("{:?}", matches);
|
2023-07-20 02:54:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn print_completions<G: Generator>(gen: G, cmd: &mut clap::Command) {
|
|
|
|
generate(gen, cmd, cmd.get_name().to_string(), &mut std::io::stdout());
|
|
|
|
}
|
|
|
|
|
2023-07-28 19:18:13 +00:00
|
|
|
#[allow(clippy::let_and_return)]
|
2023-07-20 02:54:00 +00:00
|
|
|
fn cli() -> clap::Command {
|
2023-07-28 18:54:02 +00:00
|
|
|
let cli = clap::Command::new("exhaustive")
|
2023-07-20 02:54:00 +00:00
|
|
|
.version("3.0")
|
|
|
|
.propagate_version(true)
|
|
|
|
.args([
|
|
|
|
clap::Arg::new("global")
|
|
|
|
.long("global")
|
|
|
|
.global(true)
|
|
|
|
.action(clap::ArgAction::SetTrue)
|
|
|
|
.help("everywhere"),
|
|
|
|
clap::Arg::new("generate")
|
|
|
|
.long("generate")
|
2023-07-28 11:10:04 +00:00
|
|
|
.value_name("SHELL")
|
2023-07-20 02:54:00 +00:00
|
|
|
.value_parser(clap::value_parser!(Shell))
|
|
|
|
.help("generate"),
|
|
|
|
])
|
|
|
|
.subcommands([
|
|
|
|
clap::Command::new("action").args([
|
|
|
|
clap::Arg::new("set-true")
|
|
|
|
.long("set-true")
|
|
|
|
.action(clap::ArgAction::SetTrue)
|
|
|
|
.help("bool"),
|
|
|
|
clap::Arg::new("set")
|
|
|
|
.long("set")
|
|
|
|
.action(clap::ArgAction::Set)
|
|
|
|
.help("value"),
|
|
|
|
clap::Arg::new("count")
|
|
|
|
.long("count")
|
|
|
|
.action(clap::ArgAction::Count)
|
|
|
|
.help("number"),
|
|
|
|
clap::Arg::new("choice")
|
|
|
|
.long("choice")
|
|
|
|
.value_parser(["first", "second"])
|
|
|
|
.help("enum"),
|
|
|
|
]),
|
|
|
|
clap::Command::new("quote")
|
|
|
|
.args([
|
|
|
|
clap::Arg::new("single-quotes")
|
|
|
|
.long("single-quotes")
|
|
|
|
.action(clap::ArgAction::SetTrue)
|
|
|
|
.help("Can be 'always', 'auto', or 'never'"),
|
|
|
|
clap::Arg::new("double-quotes")
|
|
|
|
.long("double-quotes")
|
|
|
|
.action(clap::ArgAction::SetTrue)
|
|
|
|
.help("Can be \"always\", \"auto\", or \"never\""),
|
|
|
|
clap::Arg::new("backticks")
|
|
|
|
.long("backticks")
|
|
|
|
.action(clap::ArgAction::SetTrue)
|
|
|
|
.help("For more information see `echo test`"),
|
|
|
|
clap::Arg::new("backslash")
|
|
|
|
.long("backslash")
|
|
|
|
.action(clap::ArgAction::SetTrue)
|
|
|
|
.help("Avoid '\\n'"),
|
|
|
|
clap::Arg::new("brackets")
|
|
|
|
.long("brackets")
|
|
|
|
.action(clap::ArgAction::SetTrue)
|
|
|
|
.help("List packages [filter]"),
|
|
|
|
clap::Arg::new("expansions")
|
|
|
|
.long("expansions")
|
|
|
|
.action(clap::ArgAction::SetTrue)
|
|
|
|
.help("Execute the shell command with $SHELL"),
|
2023-09-07 11:49:43 +00:00
|
|
|
clap::Arg::new("choice")
|
|
|
|
.long("choice")
|
|
|
|
.action(clap::ArgAction::Set)
|
|
|
|
.value_parser(clap::builder::PossibleValuesParser::new([
|
|
|
|
PossibleValue::new("bash").help("bash (shell)"),
|
|
|
|
PossibleValue::new("fish").help("fish shell"),
|
|
|
|
PossibleValue::new("zsh").help("zsh shell"),
|
|
|
|
])),
|
2023-07-20 02:54:00 +00:00
|
|
|
])
|
|
|
|
.subcommands([
|
|
|
|
clap::Command::new("cmd-single-quotes")
|
|
|
|
.about("Can be 'always', 'auto', or 'never'"),
|
|
|
|
clap::Command::new("cmd-double-quotes")
|
|
|
|
.about("Can be \"always\", \"auto\", or \"never\""),
|
|
|
|
clap::Command::new("cmd-backticks")
|
|
|
|
.about("For more information see `echo test`"),
|
|
|
|
clap::Command::new("cmd-backslash").about("Avoid '\\n'"),
|
|
|
|
clap::Command::new("cmd-brackets").about("List packages [filter]"),
|
|
|
|
clap::Command::new("cmd-expansions")
|
|
|
|
.about("Execute the shell command with $SHELL"),
|
2023-08-03 09:41:05 +00:00
|
|
|
clap::Command::new("escape-help").about("\\tab\t\"'\nNew Line"),
|
2023-07-20 02:54:00 +00:00
|
|
|
]),
|
|
|
|
clap::Command::new("value").args([
|
|
|
|
clap::Arg::new("delim").long("delim").value_delimiter(','),
|
|
|
|
clap::Arg::new("tuple").long("tuple").num_args(2),
|
|
|
|
clap::Arg::new("require-eq")
|
|
|
|
.long("require-eq")
|
|
|
|
.require_equals(true),
|
|
|
|
clap::Arg::new("term").num_args(1..).value_terminator(";"),
|
|
|
|
]),
|
|
|
|
clap::Command::new("pacman").subcommands([
|
|
|
|
clap::Command::new("one").long_flag("one").short_flag('o'),
|
|
|
|
clap::Command::new("two").long_flag("two").short_flag('t'),
|
|
|
|
]),
|
|
|
|
clap::Command::new("last")
|
|
|
|
.args([clap::Arg::new("first"), clap::Arg::new("free").last(true)]),
|
|
|
|
clap::Command::new("alias").args([
|
|
|
|
clap::Arg::new("flag")
|
|
|
|
.short('f')
|
|
|
|
.visible_short_alias('F')
|
|
|
|
.long("flag")
|
|
|
|
.action(clap::ArgAction::SetTrue)
|
|
|
|
.visible_alias("flg")
|
|
|
|
.help("cmd flag"),
|
|
|
|
clap::Arg::new("option")
|
|
|
|
.short('o')
|
|
|
|
.visible_short_alias('O')
|
|
|
|
.long("option")
|
|
|
|
.visible_alias("opt")
|
|
|
|
.help("cmd option")
|
|
|
|
.action(clap::ArgAction::Set),
|
|
|
|
clap::Arg::new("positional"),
|
|
|
|
]),
|
|
|
|
clap::Command::new("hint").args([
|
|
|
|
clap::Arg::new("choice")
|
|
|
|
.long("choice")
|
|
|
|
.action(clap::ArgAction::Set)
|
|
|
|
.value_parser(["bash", "fish", "zsh"]),
|
|
|
|
clap::Arg::new("unknown")
|
|
|
|
.long("unknown")
|
|
|
|
.value_hint(clap::ValueHint::Unknown),
|
|
|
|
clap::Arg::new("other")
|
|
|
|
.long("other")
|
|
|
|
.value_hint(clap::ValueHint::Other),
|
|
|
|
clap::Arg::new("path")
|
|
|
|
.long("path")
|
|
|
|
.short('p')
|
|
|
|
.value_hint(clap::ValueHint::AnyPath),
|
|
|
|
clap::Arg::new("file")
|
|
|
|
.long("file")
|
|
|
|
.short('f')
|
|
|
|
.value_hint(clap::ValueHint::FilePath),
|
|
|
|
clap::Arg::new("dir")
|
|
|
|
.long("dir")
|
|
|
|
.short('d')
|
|
|
|
.value_hint(clap::ValueHint::DirPath),
|
|
|
|
clap::Arg::new("exe")
|
|
|
|
.long("exe")
|
|
|
|
.short('e')
|
|
|
|
.value_hint(clap::ValueHint::ExecutablePath),
|
|
|
|
clap::Arg::new("cmd_name")
|
|
|
|
.long("cmd-name")
|
|
|
|
.value_hint(clap::ValueHint::CommandName),
|
|
|
|
clap::Arg::new("cmd")
|
|
|
|
.long("cmd")
|
|
|
|
.short('c')
|
|
|
|
.value_hint(clap::ValueHint::CommandString),
|
|
|
|
clap::Arg::new("command_with_args")
|
|
|
|
.action(clap::ArgAction::Set)
|
|
|
|
.num_args(1..)
|
|
|
|
.trailing_var_arg(true)
|
|
|
|
.value_hint(clap::ValueHint::CommandWithArguments),
|
|
|
|
clap::Arg::new("user")
|
|
|
|
.short('u')
|
|
|
|
.long("user")
|
|
|
|
.value_hint(clap::ValueHint::Username),
|
|
|
|
clap::Arg::new("host")
|
|
|
|
.short('H')
|
|
|
|
.long("host")
|
|
|
|
.value_hint(clap::ValueHint::Hostname),
|
|
|
|
clap::Arg::new("url")
|
|
|
|
.long("url")
|
|
|
|
.value_hint(clap::ValueHint::Url),
|
|
|
|
clap::Arg::new("email")
|
|
|
|
.long("email")
|
|
|
|
.value_hint(clap::ValueHint::EmailAddress),
|
|
|
|
]),
|
2023-07-28 11:10:04 +00:00
|
|
|
]);
|
|
|
|
#[cfg(feature = "unstable-dynamic")]
|
|
|
|
let cli = clap_complete::dynamic::shells::CompleteCommand::augment_subcommands(cli);
|
|
|
|
cli
|
2023-07-20 02:54:00 +00:00
|
|
|
}
|