mirror of
https://github.com/clap-rs/clap
synced 2024-12-15 15:22:30 +00:00
f70ebe89a7
Before we introduced actions, it required specific setups to engage with claps version and help printing. With actions making that more explicit, we don't get as much benefit from our multiple, obscure, ways of users customizing help Before - Modify existing help or version with `mut_arg` which would automatically be pushed down the command tree like `global(true)` - Create an new help or version and have it treated as if it was the built-in on (I think) - Use the same flags as built-in and have the built-in flags automatically disabled - Users could explicitly disable the built-in functionality and do what they want Now - `mut_arg` no longer works as we define help and version flags at the end - If someone defines a flag that overlaps with the built-ins by id, long, or short, a debug assert will tell them to explicitly disable the built-in - Any customization has to be done by a user providing their own. To propagate through the command tree, they need to set `global(true)`. Benefits - Hopefully, this makes it less confusing on how to override help behavior. Someone creates an arg and we then tell them how to disable the built-in - This greatly simplifies the arg handling by pushing more responsibility onto the developer in what are hopefully just corner cases - This removes about 1Kb from .text Fixes #3405 Fixes #4033
336 lines
9 KiB
Rust
336 lines
9 KiB
Rust
use super::utils;
|
|
|
|
use std::str;
|
|
|
|
use clap::{Arg, ArgAction, Command};
|
|
|
|
#[test]
|
|
fn no_derive_order() {
|
|
static NO_DERIVE_ORDER: &str = "test 1.2
|
|
|
|
USAGE:
|
|
test [OPTIONS]
|
|
|
|
OPTIONS:
|
|
--flag_a second flag
|
|
--flag_b first flag
|
|
-h, --help Print help information
|
|
--option_a <option_a> second option
|
|
--option_b <option_b> first option
|
|
-V, --version Print version information
|
|
";
|
|
|
|
let cmd = Command::new("test")
|
|
.version("1.2")
|
|
.next_display_order(None)
|
|
.args(&[
|
|
Arg::new("flag_b")
|
|
.long("flag_b")
|
|
.help("first flag")
|
|
.action(ArgAction::SetTrue),
|
|
Arg::new("option_b")
|
|
.long("option_b")
|
|
.action(ArgAction::Set)
|
|
.help("first option"),
|
|
Arg::new("flag_a")
|
|
.long("flag_a")
|
|
.help("second flag")
|
|
.action(ArgAction::SetTrue),
|
|
Arg::new("option_a")
|
|
.long("option_a")
|
|
.action(ArgAction::Set)
|
|
.help("second option"),
|
|
]);
|
|
|
|
utils::assert_output(cmd, "test --help", NO_DERIVE_ORDER, false);
|
|
}
|
|
|
|
#[test]
|
|
fn derive_order() {
|
|
static UNIFIED_HELP_AND_DERIVE: &str = "test 1.2
|
|
|
|
USAGE:
|
|
test [OPTIONS]
|
|
|
|
OPTIONS:
|
|
--flag_b first flag
|
|
--option_b <option_b> first option
|
|
--flag_a second flag
|
|
--option_a <option_a> second option
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
";
|
|
|
|
let cmd = Command::new("test").version("1.2").args(&[
|
|
Arg::new("flag_b")
|
|
.long("flag_b")
|
|
.help("first flag")
|
|
.action(ArgAction::SetTrue),
|
|
Arg::new("option_b")
|
|
.long("option_b")
|
|
.action(ArgAction::Set)
|
|
.help("first option"),
|
|
Arg::new("flag_a")
|
|
.long("flag_a")
|
|
.help("second flag")
|
|
.action(ArgAction::SetTrue),
|
|
Arg::new("option_a")
|
|
.long("option_a")
|
|
.action(ArgAction::Set)
|
|
.help("second option"),
|
|
]);
|
|
|
|
utils::assert_output(cmd, "test --help", UNIFIED_HELP_AND_DERIVE, false);
|
|
}
|
|
|
|
#[test]
|
|
fn derive_order_next_order() {
|
|
static HELP: &str = "test 1.2
|
|
|
|
USAGE:
|
|
test [OPTIONS]
|
|
|
|
OPTIONS:
|
|
--flag_b first flag
|
|
--option_b <option_b> first option
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
--flag_a second flag
|
|
--option_a <option_a> second option
|
|
";
|
|
|
|
let cmd = Command::new("test")
|
|
.version("1.2")
|
|
.next_display_order(10000)
|
|
.arg(
|
|
Arg::new("flag_a")
|
|
.long("flag_a")
|
|
.help("second flag")
|
|
.action(ArgAction::SetTrue),
|
|
)
|
|
.arg(
|
|
Arg::new("option_a")
|
|
.long("option_a")
|
|
.action(ArgAction::Set)
|
|
.help("second option"),
|
|
)
|
|
.next_display_order(10)
|
|
.arg(
|
|
Arg::new("flag_b")
|
|
.long("flag_b")
|
|
.help("first flag")
|
|
.action(ArgAction::SetTrue),
|
|
)
|
|
.arg(
|
|
Arg::new("option_b")
|
|
.long("option_b")
|
|
.action(ArgAction::Set)
|
|
.help("first option"),
|
|
);
|
|
|
|
utils::assert_output(cmd, "test --help", HELP, false);
|
|
}
|
|
|
|
#[test]
|
|
fn derive_order_no_next_order() {
|
|
static HELP: &str = "test 1.2
|
|
|
|
USAGE:
|
|
test [OPTIONS]
|
|
|
|
OPTIONS:
|
|
--flag_a first flag
|
|
--flag_b second flag
|
|
-h, --help Print help information
|
|
--option_a <option_a> first option
|
|
--option_b <option_b> second option
|
|
-V, --version Print version information
|
|
";
|
|
|
|
let cmd = Command::new("test")
|
|
.version("1.2")
|
|
.next_display_order(None)
|
|
.arg(
|
|
Arg::new("flag_a")
|
|
.long("flag_a")
|
|
.help("first flag")
|
|
.action(ArgAction::SetTrue),
|
|
)
|
|
.arg(
|
|
Arg::new("option_a")
|
|
.long("option_a")
|
|
.action(ArgAction::Set)
|
|
.help("first option"),
|
|
)
|
|
.arg(
|
|
Arg::new("flag_b")
|
|
.long("flag_b")
|
|
.help("second flag")
|
|
.action(ArgAction::SetTrue),
|
|
)
|
|
.arg(
|
|
Arg::new("option_b")
|
|
.long("option_b")
|
|
.action(ArgAction::Set)
|
|
.help("second option"),
|
|
);
|
|
|
|
utils::assert_output(cmd, "test --help", HELP, false);
|
|
}
|
|
|
|
#[test]
|
|
fn derive_order_subcommand_propagate() {
|
|
static UNIFIED_DERIVE_SC_PROP: &str = "test-sub 1.2
|
|
|
|
USAGE:
|
|
test sub [OPTIONS]
|
|
|
|
OPTIONS:
|
|
--flag_b first flag
|
|
--option_b <option_b> first option
|
|
--flag_a second flag
|
|
--option_a <option_a> second option
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
";
|
|
|
|
let cmd = Command::new("test").subcommand(
|
|
Command::new("sub").version("1.2").args(&[
|
|
Arg::new("flag_b")
|
|
.long("flag_b")
|
|
.help("first flag")
|
|
.action(ArgAction::SetTrue),
|
|
Arg::new("option_b")
|
|
.long("option_b")
|
|
.action(ArgAction::Set)
|
|
.help("first option"),
|
|
Arg::new("flag_a")
|
|
.long("flag_a")
|
|
.help("second flag")
|
|
.action(ArgAction::SetTrue),
|
|
Arg::new("option_a")
|
|
.long("option_a")
|
|
.action(ArgAction::Set)
|
|
.help("second option"),
|
|
]),
|
|
);
|
|
|
|
utils::assert_output(cmd, "test sub --help", UNIFIED_DERIVE_SC_PROP, false);
|
|
}
|
|
|
|
#[test]
|
|
fn derive_order_subcommand_propagate_with_explicit_display_order() {
|
|
static UNIFIED_DERIVE_SC_PROP_EXPLICIT_ORDER: &str = "test-sub 1.2
|
|
|
|
USAGE:
|
|
test sub [OPTIONS]
|
|
|
|
OPTIONS:
|
|
--flag_a second flag
|
|
--flag_b first flag
|
|
--option_b <option_b> first option
|
|
--option_a <option_a> second option
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
";
|
|
|
|
let cmd = Command::new("test").subcommand(
|
|
Command::new("sub").version("1.2").args(&[
|
|
Arg::new("flag_b")
|
|
.long("flag_b")
|
|
.help("first flag")
|
|
.action(ArgAction::SetTrue),
|
|
Arg::new("option_b")
|
|
.long("option_b")
|
|
.action(ArgAction::Set)
|
|
.help("first option"),
|
|
Arg::new("flag_a")
|
|
.long("flag_a")
|
|
.help("second flag")
|
|
.display_order(0)
|
|
.action(ArgAction::SetTrue),
|
|
Arg::new("option_a")
|
|
.long("option_a")
|
|
.action(ArgAction::Set)
|
|
.help("second option"),
|
|
]),
|
|
);
|
|
|
|
utils::assert_output(
|
|
cmd,
|
|
"test sub --help",
|
|
UNIFIED_DERIVE_SC_PROP_EXPLICIT_ORDER,
|
|
false,
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn subcommand_sorted_display_order() {
|
|
static SUBCMD_ALPHA_ORDER: &str = "test 1
|
|
|
|
USAGE:
|
|
test [SUBCOMMAND]
|
|
|
|
OPTIONS:
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
|
|
SUBCOMMANDS:
|
|
a1 blah a1
|
|
b1 blah b1
|
|
help Print this message or the help of the given subcommand(s)
|
|
";
|
|
|
|
let app_subcmd_alpha_order = Command::new("test")
|
|
.version("1")
|
|
.next_display_order(None)
|
|
.subcommands(vec![
|
|
Command::new("b1")
|
|
.about("blah b1")
|
|
.arg(Arg::new("test").short('t').action(ArgAction::SetTrue)),
|
|
Command::new("a1")
|
|
.about("blah a1")
|
|
.arg(Arg::new("roster").short('r').action(ArgAction::SetTrue)),
|
|
]);
|
|
|
|
utils::assert_output(
|
|
app_subcmd_alpha_order,
|
|
"test --help",
|
|
SUBCMD_ALPHA_ORDER,
|
|
false,
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn subcommand_derived_display_order() {
|
|
static SUBCMD_DECL_ORDER: &str = "test 1
|
|
|
|
USAGE:
|
|
test [SUBCOMMAND]
|
|
|
|
OPTIONS:
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
|
|
SUBCOMMANDS:
|
|
b1 blah b1
|
|
a1 blah a1
|
|
help Print this message or the help of the given subcommand(s)
|
|
";
|
|
|
|
let app_subcmd_decl_order = Command::new("test").version("1").subcommands(vec![
|
|
Command::new("b1")
|
|
.about("blah b1")
|
|
.arg(Arg::new("test").short('t').action(ArgAction::SetTrue)),
|
|
Command::new("a1")
|
|
.about("blah a1")
|
|
.arg(Arg::new("roster").short('r').action(ArgAction::SetTrue)),
|
|
]);
|
|
|
|
utils::assert_output(
|
|
app_subcmd_decl_order,
|
|
"test --help",
|
|
SUBCMD_DECL_ORDER,
|
|
false,
|
|
);
|
|
}
|