How do I specify a boolean command line flag using Clap?

Viewed 7216

I want to add a command line flag. It's a flag, so it does not take an argument, it is either present or not. I also need to know how to read the flag, either TRUE or FALSE.

This is the code for defining the flag:

.arg(
    Arg::with_name("metal")
        .long("metal-micky")
        .required(false)
        .help("I want metal micky"),
)

I am trying to read the value like this:

let z = matches.value_of("metal");

However it is resulting in None when I print it:

println!("FLAG: {:?}", z);

It is None even when I specify the flag on the command line.

3 Answers

Don't know if this is the "approved" method but I use Args::takes_value:

.arg(
    Arg::with_name("metal")
        .long("metal-micky")
        .required(false)
        .takes_value(false)
        .help("I want metal micky"),
)

Then check if the flag was passed with matches.is_present("metal")

The currently accepted answer is slightly outdated, you no longer have to specify required(false) when you specify takes_value(false). So, what you need is:

.arg(
    Arg::with_name("metal")
        .long("metal-micky")
        .takes_value(false)
        .help("I want metal mickey")

and check the presence with matches.is_present("metal").

This can be done with the action attribute. If your field is a bool then by default the action selected is ArgAction::SetTrue.

This is quite nice since you don't need to set a value when you call the argument. It sets the value by default to true if used and false if not used when running the program.

use clap::Parser;

/// This is a simple program
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
struct Args {
   /// It just works!
   #[clap(long, short, action)]
   it_just_works: bool,
}

fn main() {
   let args = Args::parse();

    println!("It just works {}!", args.it_just_works)
}

Docs.

Related