Search code examples
rustclap

Provide Default Value for ArgEnum in Rust Clap CLI


In Clap, we can use enum as the input for the cli according to https://docs.rs/clap/latest/clap/trait.ValueEnum.html:

#[derive(clap::Parser)]
struct Args {
   #[clap(value_enum)]
   level: Level,
}

#[derive(clap::ValueEnum, Clone)]
enum Level {
   Debug,
   Info,
   Warning,
   Error,
}

We can provide default like so:

struct Args {
   #[clap(value_enum, default_value="debug")]
   level: Level,
}

This works. However, is there a way to provide default value in a type-safe way?


Solution

  • Use default_value_t:

    use clap::{Parser, ValueEnum};
    
    #[derive(Parser, Debug)]
    struct Args {
        #[clap(value_enum, default_value_t=Level::Debug)]
        level: Level,
    }
    
    #[derive(ValueEnum, Clone, Debug)]
    enum Level {
        Debug,
        Info,
        Warning,
        Error,
    }
    
    fn main() {
        println!("{:?}", Args::parse());
    }
    
    Args { level: Debug }