1 个稳定版本
使用旧的 Rust 2015
1.0.0 | 2020 年 6 月 26 日 |
---|
#704 in 配置
13KB
215 行
Yasec
又一个愚蠢的环境配置(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