| Crates.io | rs_envflag |
| lib.rs | rs_envflag |
| version | 0.4.1 |
| created_at | 2023-05-13 10:10:48.187932+00 |
| updated_at | 2024-07-10 15:03:04.484202+00 |
| description | An easy way to define flags by environment variables |
| homepage | |
| repository | https://github.com/TimeExceed/rsenvflag |
| max_upload_size | |
| id | 863653 |
| size | 26,248 |
This crate provides an easy to define flags controlled by environment variables. It is a rust, and of course much more rustacean, reimplementation of https://github.com/TimeExceed/envflag.
Here is an example about defining a str flag.
use rs_envflag_macros::*;
/// an example about str flag
#[envflag]
const STR_FLAG: Option<String>;
fn main() {
if let Some(x) = STR_FLAG.fetch().unwrap() {
println!("{}", x);
} else {
println!("not present.");
}
}
When we run it directly, STR_FLAG will be None.
$ cargo build --examples && target/debug/examples/str
not present.
But once STR_FLAG is set, it looks like
$ cargo build --examples && STR_FLAG=abc target/debug/examples/str
abc
Also we can define default values to flags.
use rs_envflag_macros::*;
/// an example about str flag with default
#[envflag(default="abc")]
const STR_FLAG_W_DEFAULT: String;
fn main() {
println!("{}", STR_FLAG_W_DEFAULT.fetch().unwrap());
}
Then we will compile and run it.
$ cargo build --examples && target/debug/examples/str && STR_FLAG_W_DEFAULT=xyz target/debug/examples/str
xyz
We can also define i64, f64 and bool flags, either with or without, default values. Please refer to examples/ for details.
Now we will show how to define flags with customized types.
use rs_envflag_macros::*;
#[envflag(parser=v_parser)]
const X: Option<V>;
fn main() {
if let Some(x) = X.fetch().unwrap() {
println!("{:?}", x);
} else {
println!("not present.");
}
}
#[derive(Debug)]
struct V(String);
fn v_parser(_key: &str, value: &str) -> anyhow::Result<V> {
Ok(V(value.to_string()))
}
To define default values of env flags of customized types, more things are required.
use rs_envflag_macros::*;
#[envflag(parser=v_parser, default=&V::DEFAULT)]
const X_W_DEFAULT: V;
fn main() {
println!("{:?}", X_W_DEFAULT.fetch().unwrap());
}
#[derive(Debug, Clone)]
struct V(String);
impl V {
const DEFAULT: V = V(String::new());
}
fn v_parser(_key: &str, value: &str) -> anyhow::Result<V> {
Ok(V(value.to_string()))
}
default=&V::DEFAULT.V must implement the Clone trait, so the default value will be cloned when necessary.Names of env variables and those in rust can be different.
We support it by env_name attribute.
use rs_envflag_macros::*;
/// env is named as `XYZ` rather `ABC`.
#[envflag(env_name="XYZ")]
const ABC: Option<String>;
fn main() {
if let Some(x) = ABC.fetch().unwrap() {
println!("{}", x);
} else {
println!("not present.");
}
}
Now, this program will response what env variable XYZ is.
$ cargo build --examples && target/debug/examples/env_rename && XYZ=xyz target/debug/examples/env_rename
not present.
xyz
Occasionally, crate rs_envflag have to be imported as a different name.
We also support this case by crate attribute.
Please refer to examples/crate_rename.rs for details.