#env-var #flags #define #set #github #envflag

rs_envflag

通过环境变量定义标志的简单方法

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日

427Rust 模式

Download history 8/week @ 2024-06-30 93/week @ 2024-07-07 10/week @ 2024-07-14 57/week @ 2024-07-28

每月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()))
}
  1. 除了解析器之外,还需要const默认值。它们必须通过引用来引用,例如,在这个例子中 default=&V::DEFAULT
  2. 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