mirror of
https://github.com/clap-rs/clap
synced 2024-12-13 22:32:33 +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.
82 lines
2.8 KiB
Rust
82 lines
2.8 KiB
Rust
// Note: this requires the `cargo` feature
|
|
|
|
use std::path::PathBuf;
|
|
|
|
use clap::{arg, command, value_parser, ArgGroup};
|
|
|
|
fn main() {
|
|
// Create application like normal
|
|
let matches = command!()
|
|
// Add the version arguments
|
|
.arg(arg!(--"set-ver" <VER> "set version manually").required(false))
|
|
.arg(arg!(--major "auto inc major"))
|
|
.arg(arg!(--minor "auto inc minor"))
|
|
.arg(arg!(--patch "auto inc patch"))
|
|
// Create a group, make it required, and add the above arguments
|
|
.group(
|
|
ArgGroup::new("vers")
|
|
.required(true)
|
|
.args(&["set-ver", "major", "minor", "patch"]),
|
|
)
|
|
// Arguments can also be added to a group individually, these two arguments
|
|
// are part of the "input" group which is not required
|
|
.arg(
|
|
arg!([INPUT_FILE] "some regular input")
|
|
.value_parser(value_parser!(PathBuf))
|
|
.group("input"),
|
|
)
|
|
.arg(
|
|
arg!(--"spec-in" <SPEC_IN> "some special input argument")
|
|
.required(false)
|
|
.value_parser(value_parser!(PathBuf))
|
|
.group("input"),
|
|
)
|
|
// Now let's assume we have a -c [config] argument which requires one of
|
|
// (but **not** both) the "input" arguments
|
|
.arg(
|
|
arg!(config: -c <CONFIG>)
|
|
.required(false)
|
|
.value_parser(value_parser!(PathBuf))
|
|
.requires("input"),
|
|
)
|
|
.get_matches();
|
|
|
|
// Let's assume the old version 1.2.3
|
|
let mut major = 1;
|
|
let mut minor = 2;
|
|
let mut patch = 3;
|
|
|
|
// See if --set-ver was used to set the version manually
|
|
let version = if let Some(ver) = matches.get_one::<String>("set-ver") {
|
|
ver.to_owned()
|
|
} else {
|
|
// Increment the one requested (in a real program, we'd reset the lower numbers)
|
|
let (maj, min, pat) = (
|
|
matches.is_present("major"),
|
|
matches.is_present("minor"),
|
|
matches.is_present("patch"),
|
|
);
|
|
match (maj, min, pat) {
|
|
(true, _, _) => major += 1,
|
|
(_, true, _) => minor += 1,
|
|
(_, _, true) => patch += 1,
|
|
_ => unreachable!(),
|
|
};
|
|
format!("{}.{}.{}", major, minor, patch)
|
|
};
|
|
|
|
println!("Version: {}", version);
|
|
|
|
// Check for usage of -c
|
|
if matches.is_present("config") {
|
|
let input = matches
|
|
.get_one::<PathBuf>("INPUT_FILE")
|
|
.unwrap_or_else(|| matches.get_one::<PathBuf>("spec-in").unwrap())
|
|
.display();
|
|
println!(
|
|
"Doing work using input {} and config {}",
|
|
input,
|
|
matches.get_one::<PathBuf>("config").unwrap().display()
|
|
);
|
|
}
|
|
}
|