6 个版本
| 0.2.1 | 2022年7月14日 |
|---|---|
| 0.2.0 | 2022年6月17日 |
| 0.1.4 | 2022年6月15日 |
| 0.1.2 | 2021年1月6日 |
| 0.1.0 | 2019年6月20日 |
#155 在 #env-var
每月 3,229 次下载
在 2 个crate中(通过 econf)使用
11KB
123 行
econf
一次性将环境变量加载到您的结构体中。

econf 允许您轻松地使用环境变量覆盖结构体字段。这对于构建可以选择性地使用环境变量覆盖某些配置的应用程序很有用。以下是基本用法
use econf::LoadEnv;
#[derive(Debug, LoadEnv)]
struct A {
x: bool,
y: u64,
}
fn main() {
let a = A {
x: true,
y: 42,
};
println!("Before: {:?}", a);
let a = econf::load(a, "PREFIX");
println!("After: {:?}", a);
}
$ ./app
Before: A { x: true, y: 42 }
After: A { x: true, y: 42 }
$ PREFIX_X=false ./app
Before: A { x: true, y: 42 }
After: A { x: false, y: 42 }
在这个例子中,
PREFIX_X被加载到xPREFIX_Y被加载到y
所有环境变量都是大写,并且用 _ 分隔。
为什么选择 econf?
有一些现有的crate提供了类似的功能,但 econf 在以下方面独具特色
- 支持嵌套:以一种直观的方式支持嵌套结构体,约束很少。
- 支持容器:支持
Vec、HashMap和各种类型。 - 补充:在不改变原始逻辑的情况下将变量加载到现有代码中。
- 贡献友好:代码库简单。通过学习基本的宏使用方法,易于理解。
支持的类型
- 布尔型:
bool - 整型:
isize、usize、i8、i16、i32、i64、i128、u8、u16、u32、u64、u128 - 字符串:
char、String - 浮点数:
f32、f64 - 网络:
IpAddr,Ipv4Addr,Ipv6Addr,SocketAddr,SocketAddrV4,SocketAddrV6 - 非零类型:
NonZeroI128,NonZeroI16,NonZeroI32,NonZeroI64,NonZeroI8,NonZeroIsize,NonZeroU128,NonZeroU16,NonZeroU32,NonZeroU64,NonZeroU8,NonZeroUsize - 文件系统:
PathBuf - 容器:
Vec,HashSet,HashMap,Option,BTreeMap,BTreeSet,BinaryHeap,LinkedList,VecDeque,tuple- 容器以 YAML 格式解析。请参阅测试。
嵌套
支持嵌套结构体。
#[derive(LoadEnv)]
struct A {
v1: usize,
v2: B,
}
#[derive(LoadEnv)]
struct B {
v1: usize,
v2: usize,
}
fn main() {
let a = A {
v1: 1,
v2: B {
v1: 2,
v2: 3,
},
};
let a = econf::load(a, "PREFIX");
}
在这个例子中,
PREFIX_V1被加载到a.v1PREFIX_V2_V1被加载到a.v2.v1PREFIX_V2_V2被加载到a.v2.v2
可以使用下划线 _ 作为分隔符通过链接字段名称来指定嵌套结构体中的字段。但是,存在名称冲突的情况。例如,
#[derive(LoadEnv)]
struct A {
v2_v1: usize,
v2: B,
}
#[derive(LoadEnv)]
struct B {
v1: usize,
v2: usize,
}
fn main() {
let a = A {
v2_v1: 1,
v2: B {
v1: 2,
v2: 3,
},
};
let a = econf::load(a, "PREFIX");
}
在这里 PREFIX_V2_V1 同时对应于 a.v2_v1 和 a.v2.v1。在这种情况下,econf 通过 log facade 打印警告,并将值加载到 a.v2_v1 和 a.v2.v1。
跳过字段
可以通过添加辅助属性 #[econf(skip)] 来跳过没有实现 LoadEnv 或不应该由 econf 加载的字段
#[derive(LoadEnv)]
struct A {
x: bool,
#[econf(skip)]
y: u64, // will not be loaded by econf
}
重命名字段
以给定的名称而不是 Rust 字段名称加载字段。如果环境变量名称和 Rust 字段名称不匹配,这很有帮助
#[derive(LoadEnv)]
struct A {
x: bool,
#[econf(rename = "ANOTHER_Y")]
y: u64, // will be loaded from an environment variable `ANOTHER_Y`
}
许可:MIT
依赖项
~2MB
~46K SLoC