5个版本
0.1.22 | 2023年6月14日 |
---|---|
0.1.21 | 2023年6月13日 |
0.1.2 | 2023年6月13日 |
0.1.1 | 2023年6月11日 |
0.1.0 | 2023年6月11日 |
#1051 在 过程宏 中
每月下载 21 次
用于 create-ruxt-app
30KB
330 代码行
env-extract
“env-extract”crate提供了将环境变量提取到不同数据类型的便捷方法。
该crate包含两个过程宏:ConfigStruct
和 EnvVar
,可以用来推导特性和自动从环境变量中提取值。
用法
要使用EnvVar
和ConfigStruct
宏,请在您的Cargo.toml
文件中将env-extract
作为依赖项添加
[dependencies]
env-extract = "0.1.22"
然后,在您的Rust代码中,通过添加以下行导入过程宏
use env_extract::{EnvVar, ConfigStruct};
ConfigStruct宏
ConfigStruct
宏应用于结构体,并推导出ConfigStruct
特证。此特证允许通过按名称从环境变量中提取每个字段来轻松检索结构体。结构体的字段有效类型如下
String
bool
u8
,u16
,u32
,u64
,u128
i8
,i16
,i32
,i64
,i128
f32
,f64
- 从枚举中推导出
EnvVar
ConfigStruct
宏支持结构体字段上的以下属性
default
:为字段设置默认值。如果没有提供,当环境变量未设置时,宏将引发panic。env_var
:设置用于此字段的环境变量名称。如果未提供,则宏将使用字段的名称大写作为环境变量名称。enumerated
:标识实现了EnvVar
特质的枚举。宏将解析环境变量到枚举类型。
EnvVar 宏
EnvVar
宏应用于枚举并实现了EnvVar
特质,该特质提供了一个.get()
方法,用于从环境变量中检索类型为T
的值。宏将环境变量解析到枚举类型。
EnvVar
宏要求枚举满足以下条件之一:
- 一个名为“Invalid”的变体,如果环境变量不匹配任何变体,则返回。
- 一个标记为
#[default]
的变体,如果环境变量不匹配任何变体,则返回。 - 要标记为
#[panic_on_invalid]
的枚举,如果环境变量不匹配任何变体,则会导致panic。
EnvVar
宏允许在枚举本身上设置以下属性:
#[env_var = "FOO"]
:设置要搜索的自定义环境变量名称。默认为枚举名称的大写。#[panic_on_invalid]
:如果没有找到有效的变体,则引发panic。#[case(convert = "[uppercase|lowercase|exact|any]")]
:在将有效变体映射之前,将所有环境变量值转换为特定的大小写。如果变体也包含此属性,则覆盖此属性。
EnvVar
宏还支持枚举变体上的以下属性:
#[case = "[uppercase|lowercase|exact|any]"]
:指定被注释枚举变体的案例转换。选项uppercase
和lowercase
在将环境变量值与变体名称比较之前将其转换为大写或小写。选项exact
在比较时不进行大小写转换。选项any
在比较之前将环境变量值和变体名称都转换为小写。#[default]
:指定默认枚举变体。#[ignore_variant]
:在检查匹配时忽略被注释的枚举变体。
示例用法
use env_extract::{ConfigStruct, EnvVar};
#[derive(Debug, EnvVar)]
#[var_name = "DATABASE_TYPE"]
#[panic_on_invalid]
#[case(convert = "lowercase")]
enum DatabaseType {
Postgres,
Mysql,
Sqlite,
}
#[derive(ConfigStruct, Debug)]
struct Config {
db_host: String,
db_port: u16,
use_tls: bool,
#[enumerated]
db_type: DatabaseType,
}
fn main() {
std::env::set_var("DB_HOST", "localhost");
std::env::set_var("DB_PORT", "5432");
std::env::set_var("USE_TLS", "true");
std::env::set_var("DATABASE_TYPE", "postgres");
let config = Config::get();
assert_eq!(config.db_host, "localhost");
assert_eq!(config.db_port, 5432);
assert_eq!(config.use_tls, true);
assert!(matches!(config.db_type, DatabaseType::Postgres));
}
在上面的示例中,使用宏 ConfigStruct
为结构体 Config
衍生 ConfigStruct
trait,从而能够轻松地从环境变量中检索值。使用宏 EnvVar
为枚举类型 DatabaseType
衍生 EnvVar
trait,允许从“DATABASE_TYPE”环境变量中提取枚举变体。环境变量值将根据指定的转换规则进行解析和转换。最后,结构体 Config
使用从环境变量中检索的值进行填充,并使用断言来验证提取的值。
依赖项
~1.5MB
~34K SLoC