Clap and environment variables
- env
In order for this feature to work we need to enable both the derive and the env features of Clap so we start with:
cargo add clap -F derive -F env
If we don’t enable the env feature we’ll get an error: no method named env found for struct Arg in the current scope with method not found in Arg.
use clap::Parser;
//use clap::ArgAction;
//use clap::{builder::ArgPredicate, ArgAction, ValueEnum};
#[derive(Parser, Debug)]
struct Cli {
#[arg(long, env = "DEMO_HOSTNAME")]
hostname: String,
}
fn main() {
let args = Cli::parse();
println!("{args:?}");
}
In this case we can pass the hostname either as a command line flag or by setting the appropriate environmnet variable.
cargo run -- --hostname localhost
DEMO_HOSTNAME=localhost cargo run
Setting the envronment can be done on the same row (on linux and macOS) as we see in our example, but it can be also set earlier.