#env-var #environment #configuration #env #field-name #macro

yasec

又一个愚蠢的环境配置(YASEC)从环境变量创建设置

1 个稳定版本

使用旧的 Rust 2015

1.0.0 2020 年 6 月 26 日

#704 in 配置

MIT 许可证

13KB
215

Yasec

Build Status License

又一个愚蠢的环境配置(YASEC)从环境变量创建设置。 (Envconig-rs 分支)

特性

  • 嵌套配置结构。
  • 环境变量名称的推断。如果配置字段名称为 password,则从环境变量 PASSWORD 获取值。如果配置字段在另一个结构内部,并且路径为 db.password,则从变量 DB_PASSWORD 获取其值。
  • 自定义类型。
  • Option 类型是可选的。
  • 变量前缀。

我在开发应用程序时实现了所有我需要的功能。您可以随意提交缺失功能的 issue 或 pull request。

宏属性

  • from - 提供字段值的环境变量名称。忽略字段的名称和父结构的名称。
  • default - 如果不存在环境变量,字段的默认值。如果环境变量存在但具有无效值,则返回错误。

用法

您可以使用以下代码实现此功能,而无需样板代码

#[macro_use]
extern crate yasec_derive;
extern crate yasec;

use std::error::Error as StdError;
use yasec::Yasec;

#[derive(Yasec)]
pub struct DB {
    pub host: String,
    pub port: u16,
}

#[derive(Yasec)]
pub struct Vendor {
    #[yasec(from = "API_KEY")]
    pub key: String,
    #[yasec(from = "API_SECRET")]
    pub secret: String,
}

#[derive(Yasec)]
pub struct Config {
    db: DB,
    vendor: Vendor,
    #[yasec(default = 8080)]
    listen_port: u16,
    callback_url: Option<String>,
    mode: Mode,
}

pub enum Mode {
    Client,
    Server,
}

impl Yasec for Mode {
    fn parse(s: &str) -> Result<Self, Box<dyn StdError>> {
        match s {
            "CLIENT" => Ok(Self::Client),
            "SERVER" => Ok(Self::Server),
            _ => Err(yasec::ParseError::new(s).into()),
        }
    }
}

fn main() {
    // Assuming the following environment variables are set
    std::env::set_var("DB_HOST", "127.0.0.1");
    std::env::set_var("DB_PORT", "5432");
    std::env::set_var("API_KEY", "0912xn819b8s1029s");
    std::env::set_var("API_SECRET", "zyYWn5pPtLcDSaFWQEu0nf1cf0eYNN8j");
    std::env::set_var("MODE", "SERVER");
    std::env::remove_var("LISTEN_PORT");
    std::env::remove_var("CALLBACK_URL");

    // Initialize config from environment variables or terminate the process.
    let config = Config::init().unwrap();

    assert_eq!(config.db.host, "127.0.0.1");
    assert_eq!(config.db.port, 5432);
    assert_eq!(config.vendor.key, "0912xn819b8s1029s");
    assert_eq!(config.vendor.secret, "zyYWn5pPtLcDSaFWQEu0nf1cf0eYNN8j");
    assert_eq!(config.listen_port, 8080);
    assert_eq!(config.callback_url, None);
    match config.mode {
        Mode::Server => (),
        _ => panic!("Unexpected value of Mode"),
    }
}

运行测试

测试对环境变量进行一些操作,因此为了防止测试不稳定,它们必须在单个线程中执行

cargo test -- --test-threads=1

许可证

许可协议为 MIT

无运行时依赖项