6 个版本 (3 个重大变更)
0.4.1 | 2024年7月10日 |
---|---|
0.4.0 | 2023年10月11日 |
0.3.0 | 2023年10月9日 |
0.2.0 | 2023年9月24日 |
0.1.0 | 2023年5月13日 |
427 在 Rust 模式 中
每月168 次下载
在 rs_envflag_macros 中使用
9KB
50 行
rs_envflag
此crate提供了一种通过环境变量定义标志的简单方法。它是对https://github.com/TimeExceed/envflag的rust重实现。
没有默认值的str标志
以下是如何定义str标志的示例。
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.");
}
}
当我们直接运行它时,STR_FLAG
将是 None
。
$ cargo build --examples && target/debug/examples/str
not present.
但是一旦 STR_FLAG
被设置,它看起来像
$ cargo build --examples && STR_FLAG=abc target/debug/examples/str
abc
具有默认值的str标志
我们还可以为标志定义默认值。
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());
}
然后我们将编译并运行它。
$ cargo build --examples && target/debug/examples/str && STR_FLAG_W_DEFAULT=xyz target/debug/examples/str
xyz
带有/不带默认值的i64/f64/bool标志
我们还可以定义带有/不带默认值的i64、f64和bool标志。有关详细信息,请参阅examples/。
自定义类型和自定义解析器
现在我们将展示如何定义带有自定义类型的标志。
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()))
}
- 只需一个解析器。它必须接受两个参数。第二个参数是要解析的值。第一个是环境变量的名称。这对于解析值不是必需的。但它在记录解析错误和警告时很方便。
要定义自定义类型环境标志的默认值,还需要更多东西。
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()))
}
- 除了解析器之外,还需要const默认值。它们必须通过引用来引用,例如,在这个例子中
default=&V::DEFAULT
。 V
必须实现Clone
特质,因此当需要时,默认值将被克隆。
标志重命名
环境变量的名称和Rust中的名称可以不同。我们通过env_name
属性来支持它。
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.");
}
}
现在,此程序将响应对环境变量 XYZ
的查询。
$ cargo build --examples && target/debug/examples/env_rename && XYZ=xyz target/debug/examples/env_rename
not present.
xyz
crate重命名
有时,必须将 rs_envflag
以不同的名称导入。我们通过 crate
属性也支持这种情况。有关详细信息,请参阅 examples/crate_rename.rs。
依赖项
~130KB