2021-12-09 15:32:33 +00:00
|
|
|
use clap::Parser;
|
|
|
|
|
|
|
|
#[derive(Parser, Debug, PartialEq)]
|
2022-01-11 00:47:20 +00:00
|
|
|
#[clap(author, version, about, long_about = None)]
|
2021-12-09 15:32:33 +00:00
|
|
|
struct Opt {
|
2022-06-01 15:31:23 +00:00
|
|
|
// Default parser for `Set` is FromStr::from_str.
|
2021-12-09 15:32:33 +00:00
|
|
|
// `impl FromStr for bool` parses `true` or `false` so this
|
|
|
|
// works as expected.
|
2022-06-01 15:31:23 +00:00
|
|
|
#[clap(long, action = clap::ArgAction::Set)]
|
2021-12-09 15:32:33 +00:00
|
|
|
foo: bool,
|
|
|
|
|
|
|
|
// Of course, this could be done with an explicit parser function.
|
2022-06-01 15:31:23 +00:00
|
|
|
#[clap(long, action = clap::ArgAction::Set, value_parser = true_or_false, default_value_t)]
|
2021-12-09 15:32:33 +00:00
|
|
|
bar: bool,
|
|
|
|
|
2022-06-01 15:31:23 +00:00
|
|
|
// `bool` can be positional only with explicit `action` annotation
|
|
|
|
#[clap(action = clap::ArgAction::Set)]
|
2021-12-09 15:32:33 +00:00
|
|
|
boom: bool,
|
|
|
|
}
|
|
|
|
|
|
|
|
fn true_or_false(s: &str) -> Result<bool, &'static str> {
|
|
|
|
match s {
|
|
|
|
"true" => Ok(true),
|
|
|
|
"false" => Ok(false),
|
|
|
|
_ => Err("expected `true` or `false`"),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let opt = Opt::parse();
|
|
|
|
dbg!(opt);
|
|
|
|
}
|