5 个版本
0.1.4 | 2023年7月25日 |
---|---|
0.1.3 | 2023年1月15日 |
0.1.2 | 2023年1月15日 |
0.1.1 | 2023年1月15日 |
0.1.0 | 2023年1月15日 |
#194 in 配置
12KB
166 行
env_struct
这个 crate 是一个非常有见地的环境管理 crate,旨在培养良好的环境管理习惯,尽可能避免全局变量,并拥有合理的默认值。
仍可使用 lazy_init
来加载结构作为全局静态。但这并不是这个项目内置的。在未来,一旦 rust_std 中的新 lazy once_cell
稳定下来,就应该能够使用它。
使用示例:
use env_struct::env_struct;
env_struct! {
#[derive(Debug)] // (Optional) Not needed, just to
// show that we keep derive & other macros intact
pub struct ConfigEnvWithDefault { // vis modifiers work too
// Will use `CONFIG_PATH`
pub config_path = "/path/to/config.toml",
// Will use `RESULT_PATH`
pub result_path = "/path/to/result.toml",
}
}
pub fn main() {
let env_config = ConfigEnvWithDefault::load_from_env();
if let Some(s) = entry_point(&env_config) {
eprintln!("Program exited successfullly!");
post_run_operations(&env_config);
// we don't care if the post run operations
// such as cleanup or such fail.
} else {
eprintln!("Program exit status invalid!");
std::process::exit(1);
}
}
或者对于需要确保环境设置的配置:
use env_struct::env_struct;
env_struct! {
#[derive(Debug)] // (Optional) Not needed, just to
// show that we keep derive & other macros intact
pub struct RequiredConfigEnv { // vis modifiers work too
// Will use `CONFIG_PATH`
pub config_path,
// Will use `RESULT_PATH`
pub result_path,
}
}
pub fn main() {
// Result<RequiredConfigEnv, String>
// Error: String above will name the var that couldn't be read.
let env_config = RequiredConfigEnv::try_load_from_env().unwrap();
if let Some(s) = entry_point(&env_config) {
eprintln!("Program exited successfullly!");
post_run_operations(&env_config);
// we don't care if the post run operations
// such as cleanup or such fail.
} else {
eprintln!("Program exit status invalid!");
std::process::exit(1);
}
}
我的观点
环境变量结构体是环境管理的一个更好的选择。
因为这样你可以确保在环境之上同步的性质是符合你自己的,而且在单线程应用程序中不需要使用 Atomic
,也就不需要为其支付成本。
此外,当你的系统已经有一个上下文提供者时,这也会工作得更好,例如在 GUI 应用程序中,用于依赖注入。
而且,即使只是为了通知用户缺少配置,也始终应该存在默认值。
路线图
- 支持自定义 env_var 键别名。
依赖
无,整个项目少于 100 行代码。
贡献
欢迎提交 PR 修复任何错误或添加更多提升生活质量的特性,只需尽量遵循“保持简单”的理念。
我不想发布那些与直接相关或很快就会在 rust_std 中实现且大多数其他 crate 都提供的功能无关的功能。
这个项目应该是一个非常简单的项目。
依赖
~22KB