mirror of
https://github.com/clap-rs/clap
synced 2024-12-13 14:22:34 +00:00
eda0ca54c1
Clap has focused on reporting development errors through assertions rather than mixing user errors with development errors. Sometimes, developers need to handle things more flexibly so included in #3732 was the reporting of value accessor failures as internal errors with a distinct type. I've been going back and forth on whether the extra error pessimises the usability in the common case vs dealing with the proliferation of different function combinations. In working on deprecating the `value_of` functions, I decided that it was going to be worth duplicating so long as we can keep the documentation focused.
59 lines
1.9 KiB
Rust
59 lines
1.9 KiB
Rust
// Note: this requires the `cargo` feature
|
|
|
|
use std::path::PathBuf;
|
|
|
|
use clap::{arg, command, value_parser, Command};
|
|
|
|
fn main() {
|
|
let matches = command!()
|
|
.arg(arg!([name] "Optional name to operate on"))
|
|
.arg(
|
|
arg!(
|
|
-c --config <FILE> "Sets a custom config file"
|
|
)
|
|
// We don't have syntax yet for optional options, so manually calling `required`
|
|
.required(false)
|
|
.value_parser(value_parser!(PathBuf)),
|
|
)
|
|
.arg(arg!(
|
|
-d --debug ... "Turn debugging information on"
|
|
))
|
|
.subcommand(
|
|
Command::new("test")
|
|
.about("does testing things")
|
|
.arg(arg!(-l --list "lists test values")),
|
|
)
|
|
.get_matches();
|
|
|
|
// You can check the value provided by positional arguments, or option arguments
|
|
if let Some(name) = matches.get_one::<String>("name") {
|
|
println!("Value for name: {}", name);
|
|
}
|
|
|
|
if let Some(config_path) = matches.get_one::<PathBuf>("config") {
|
|
println!("Value for config: {}", config_path.display());
|
|
}
|
|
|
|
// You can see how many times a particular flag or argument occurred
|
|
// Note, only flags can have multiple occurrences
|
|
match matches.occurrences_of("debug") {
|
|
0 => println!("Debug mode is off"),
|
|
1 => println!("Debug mode is kind of on"),
|
|
2 => println!("Debug mode is on"),
|
|
_ => println!("Don't be crazy"),
|
|
}
|
|
|
|
// You can check for the existence of subcommands, and if found use their
|
|
// matches just as you would the top level cmd
|
|
if let Some(matches) = matches.subcommand_matches("test") {
|
|
// "$ myapp test" was run
|
|
if matches.is_present("list") {
|
|
// "$ myapp test -l" was run
|
|
println!("Printing testing lists...");
|
|
} else {
|
|
println!("Not printing testing lists...");
|
|
}
|
|
}
|
|
|
|
// Continued program logic goes here...
|
|
}
|