mirror of
https://github.com/clap-rs/clap
synced 2024-12-14 14:52:33 +00:00
d840d5650e
Before #2005, `Clap` was a special trait that derived all clap traits it detected were relevant (including an enum getting both `ArgEnum`, `Clap`, and `Subcommand`). Now, we have elevated `Clap`, `Args`, `Subcommand`, and `ArgEnum` to be user facing but the name `Clap` isn't very descriptive. This also helps further clarify the relationships so a crate providing an item to be `#[clap(flatten)]` or `#[clap(subcommand)]` is more likely to choose the needed trait to derive. Also, my proposed fix fo #2785 includes making `App` attributes almost exclusively for `Clap`. Clarifying the names/roles will help communicate this. For prior discussion, see #2583
41 lines
1.1 KiB
Rust
41 lines
1.1 KiB
Rust
//! How to parse `--foo=true --bar=false` and turn them into bool.
|
|
|
|
use clap::Parser;
|
|
|
|
fn true_or_false(s: &str) -> Result<bool, &'static str> {
|
|
match s {
|
|
"true" => Ok(true),
|
|
"false" => Ok(false),
|
|
_ => Err("expected `true` or `false`"),
|
|
}
|
|
}
|
|
|
|
#[derive(Parser, Debug, PartialEq)]
|
|
struct Opt {
|
|
// Default parser for `try_from_str` is FromStr::from_str.
|
|
// `impl FromStr for bool` parses `true` or `false` so this
|
|
// works as expected.
|
|
#[clap(long, parse(try_from_str))]
|
|
foo: bool,
|
|
|
|
// Of course, this could be done with an explicit parser function.
|
|
#[clap(long, parse(try_from_str = true_or_false))]
|
|
bar: bool,
|
|
|
|
// `bool` can be positional only with explicit `parse(...)` annotation
|
|
#[clap(long, parse(try_from_str))]
|
|
boom: bool,
|
|
}
|
|
|
|
fn main() {
|
|
assert_eq!(
|
|
Opt::parse_from(&["test", "--foo=true", "--bar=false", "true"]),
|
|
Opt {
|
|
foo: true,
|
|
bar: false,
|
|
boom: true
|
|
}
|
|
);
|
|
// no beauty, only truth and falseness
|
|
assert!(Opt::try_parse_from(&["test", "--foo=beauty"]).is_err());
|
|
}
|