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.
91 lines
3.1 KiB
Rust
91 lines
3.1 KiB
Rust
// Note: this requires the `cargo` feature
|
|
|
|
use std::path::PathBuf;
|
|
|
|
use clap::{arg, command, value_parser, ErrorKind};
|
|
|
|
fn main() {
|
|
// Create application like normal
|
|
let mut cmd = 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"))
|
|
// 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)))
|
|
.arg(
|
|
arg!(--"spec-in" <SPEC_IN> "some special input argument")
|
|
.required(false)
|
|
.value_parser(value_parser!(PathBuf)),
|
|
)
|
|
// 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)),
|
|
);
|
|
let matches = cmd.get_matches_mut();
|
|
|
|
// 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") {
|
|
if matches.is_present("major") || matches.is_present("minor") || matches.is_present("patch")
|
|
{
|
|
cmd.error(
|
|
ErrorKind::ArgumentConflict,
|
|
"Can't do relative and absolute version change",
|
|
)
|
|
.exit();
|
|
}
|
|
ver.to_string()
|
|
} 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, false, false) => major += 1,
|
|
(false, true, false) => minor += 1,
|
|
(false, false, true) => patch += 1,
|
|
_ => {
|
|
cmd.error(
|
|
ErrorKind::ArgumentConflict,
|
|
"Can only modify one version field",
|
|
)
|
|
.exit();
|
|
}
|
|
};
|
|
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")
|
|
.or_else(|| matches.get_one::<PathBuf>("spec-in"))
|
|
.unwrap_or_else(|| {
|
|
cmd.error(
|
|
ErrorKind::MissingRequiredArgument,
|
|
"INPUT_FILE or --spec-in is required when using --config",
|
|
)
|
|
.exit()
|
|
})
|
|
.display();
|
|
println!(
|
|
"Doing work using input {} and config {}",
|
|
input,
|
|
matches.get_one::<PathBuf>("config").unwrap().display()
|
|
);
|
|
}
|
|
}
|