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