mirror of
https://github.com/clap-rs/clap
synced 2025-03-04 23:37:32 +00:00
In surveying various tools and CLI parsers, I noticed they list the subcommands first. This puts an emphasis on them which makes sense because that is most likely what an end user is supposed to pass in next. Listing them last aligns with the usage order but it probably doesn't outweigh the value of getting a user moving forward.
149 lines
3.6 KiB
Rust
149 lines
3.6 KiB
Rust
use super::utils;
|
|
|
|
use clap::{arg, Command};
|
|
|
|
static EXAMPLE1_TMPL_S: &str = "{bin} {version}
|
|
{author}
|
|
{about}
|
|
|
|
Usage:
|
|
{usage}
|
|
|
|
{all-args}";
|
|
|
|
static EXAMPLE1_TMPS_F: &str = "{bin} {version}
|
|
{author}
|
|
{about}
|
|
|
|
Usage:
|
|
{usage}
|
|
|
|
Options:
|
|
{options}
|
|
Arguments:
|
|
{positionals}
|
|
Subcommands:
|
|
{subcommands}";
|
|
|
|
static CUSTOM_TEMPL_HELP: &str = "MyApp 1.0
|
|
Kevin K. <kbknapp@gmail.com>
|
|
Does awesome things
|
|
|
|
Usage:
|
|
MyApp [OPTIONS] <output> [SUBCOMMAND]
|
|
|
|
Options:
|
|
-c, --config <FILE> Sets a custom config file
|
|
-d... Turn debugging information on
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
Arguments:
|
|
<output> Sets an optional output file
|
|
Subcommands:
|
|
test does testing things
|
|
help Print this message or the help of the given subcommand(s)
|
|
";
|
|
|
|
static SIMPLE_TEMPLATE: &str = "MyApp 1.0
|
|
Kevin K. <kbknapp@gmail.com>
|
|
Does awesome things
|
|
|
|
Usage:
|
|
MyApp [OPTIONS] <output> [SUBCOMMAND]
|
|
|
|
Subcommands:
|
|
test does testing things
|
|
help Print this message or the help of the given subcommand(s)
|
|
|
|
Arguments:
|
|
<output> Sets an optional output file
|
|
|
|
Options:
|
|
-c, --config <FILE> Sets a custom config file
|
|
-d... Turn debugging information on
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
";
|
|
|
|
#[test]
|
|
fn with_template() {
|
|
let cmd = get_app().help_template(EXAMPLE1_TMPL_S);
|
|
utils::assert_output(cmd, "MyApp --help", SIMPLE_TEMPLATE, false);
|
|
}
|
|
|
|
#[test]
|
|
fn custom_template() {
|
|
let cmd = get_app().help_template(EXAMPLE1_TMPS_F);
|
|
utils::assert_output(cmd, "MyApp --help", CUSTOM_TEMPL_HELP, false);
|
|
}
|
|
|
|
#[test]
|
|
fn template_empty() {
|
|
let cmd = Command::new("MyApp")
|
|
.version("1.0")
|
|
.author("Kevin K. <kbknapp@gmail.com>")
|
|
.about("Does awesome things")
|
|
.help_template("");
|
|
utils::assert_output(cmd, "MyApp --help", "\n", false);
|
|
}
|
|
|
|
#[test]
|
|
fn template_notag() {
|
|
let cmd = Command::new("MyApp")
|
|
.version("1.0")
|
|
.author("Kevin K. <kbknapp@gmail.com>")
|
|
.about("Does awesome things")
|
|
.help_template("test no tag test");
|
|
utils::assert_output(cmd, "MyApp --help", "test no tag test\n", false);
|
|
}
|
|
|
|
#[test]
|
|
fn template_unknowntag() {
|
|
let cmd = Command::new("MyApp")
|
|
.version("1.0")
|
|
.author("Kevin K. <kbknapp@gmail.com>")
|
|
.about("Does awesome things")
|
|
.help_template("test {unknown_tag} test");
|
|
utils::assert_output(cmd, "MyApp --help", "test {unknown_tag} test\n", false);
|
|
}
|
|
|
|
#[test]
|
|
fn template_author_version() {
|
|
let cmd = Command::new("MyApp")
|
|
.version("1.0")
|
|
.author("Kevin K. <kbknapp@gmail.com>")
|
|
.about("Does awesome things")
|
|
.help_template("{author}\n{version}\n{about}\n{bin}");
|
|
utils::assert_output(
|
|
cmd,
|
|
"MyApp --help",
|
|
"Kevin K. <kbknapp@gmail.com>\n1.0\nDoes awesome things\nMyApp\n",
|
|
false,
|
|
);
|
|
}
|
|
|
|
// ----------
|
|
|
|
fn get_app() -> Command {
|
|
Command::new("MyApp")
|
|
.version("1.0")
|
|
.author("Kevin K. <kbknapp@gmail.com>")
|
|
.about("Does awesome things")
|
|
.arg(
|
|
arg!(
|
|
-c --config <FILE> "Sets a custom config file"
|
|
)
|
|
.required(false),
|
|
)
|
|
.arg(arg!(
|
|
<output> "Sets an optional output file"
|
|
))
|
|
.arg(arg!(
|
|
d: -d ... "Turn debugging information on"
|
|
))
|
|
.subcommand(
|
|
Command::new("test")
|
|
.about("does testing things")
|
|
.arg(arg!(-l --list "lists test values")),
|
|
)
|
|
}
|