#env-var #variables #environment #settings #base-settings

env-settings-utils

使用环境变量初始化Rust结构体(如 pydanticBaseSettings

11个版本

0.1.11 2024年2月20日
0.1.10 2024年2月19日
0.1.9 2023年12月13日
0.1.7 2023年9月19日
0.1.1 2023年7月29日

#20 in #env-variables

Download history 159/week @ 2024-04-03 77/week @ 2024-04-10 18/week @ 2024-04-17 178/week @ 2024-04-24 125/week @ 2024-05-01 7/week @ 2024-05-08 9/week @ 2024-05-15 117/week @ 2024-05-22 19/week @ 2024-05-29 23/week @ 2024-06-05 66/week @ 2024-06-12 88/week @ 2024-06-19 16/week @ 2024-06-26 9/week @ 2024-07-03

每月下载量 82
用于 2 crates

MIT/Apache

13KB
105

环境设置

Env Settings

crates license validate

环境设置 是一个Rust库,帮助您使用环境变量初始化结构体

这个Rust库受到了 pydantic's BaseSettings Python类的启发

安装

cargo add env-settings env-settings-derive env-settings-utils

用法

当您将 EnvSettings derive 添加到结构体时,会为其添加两个公共方法

  • fn from_env(...) -> env_settings_utils::EnvSettingsResult<Self>
    

    仅使用环境变量创建一个新的实例。必须传递跳过的字段。如果出现问题,则返回一个 env_settings_utils::EnvSettingsError 错误

  • fn new(...) -> env_settings_utils::EnvSettingsResult<Self>
    

    使用环境变量和参数的组合创建一个新的实例。更详细地说,可以通过 Option 对象传递可以由环境变量初始化的每个字段。然后如果参数是 Some,则使用它,否则从环境变量中恢复值。必须传递跳过的字段。如果出现问题,则返回一个 env_settings_utils::EnvSettingsError 错误

基本

export name=paolo
export favourite_number=42
use env_settings_derive::EnvSettings;

#[derive(EnvSettings)]
struct MyStruct {
    name: String,

    favourite_number: u8,
}

fn main() {
    let my_struct = MyStruct::from_env().unwrap();
    assert_eq!(my_struct.name, "paolo".to_string());
    assert_eq!(my_struct.favourite_number, 42);

    let name = "luca";
    let my_struct = MyStruct::new(Some(name.to_string()), None).unwrap();
    assert_eq!(my_struct.name, name);
    assert_eq!(my_struct.favourite_number, 42);
}

高级

echo "MY_STRUCT_FAVOURITE_NUMBER=42\n" > .env
export MY_BIRTH_DATE=01/01/1970
use env_settings_derive::EnvSettings;

#[derive(EnvSettings)]
#[env_settings(case_insensitive, file_path = ".env", prefix="MY_STRUCT_")]
struct MyStruct {
    #[env_settings(default = "paolo")]
    name: String,

    favourite_number: u8,

    #[env_settings(variable = "MY_BIRTH_DATE")]
    birth_date: String,

    birth_place: Option<String>,

    #[env_settings(skip)]
    friends: Vec<String>,
}

fn main() {
    let friends = vec!["luca".to_string()];
    let my_struct = MyStruct::from_env(friends.clone()).unwrap();
    assert_eq!(my_struct.name, "paolo".to_string());
    assert_eq!(my_struct.favourite_number, 42);
    assert_eq!(my_struct.birth_date, "01/01/1970");
    assert_eq!(my_struct.birth_place, None);
    assert_eq!(my_struct.friends, friends);

    let name = "luca";
    let my_struct = MyStruct::new(
        Some(name.to_string()),
        None,
        None,
        Some("london".to_string()),
        friends.clone(),
    ).unwrap();
    assert_eq!(my_struct.name, name);
    assert_eq!(my_struct.favourite_number, 42);
    assert_eq!(my_struct.birth_date, "01/01/1970");
    assert_eq!(my_struct.birth_place, Some("london".to_string()));
    assert_eq!(my_struct.friends, friends);
}

参数

结构体

当前支持的结构体参数为

  • case_insensitive:是否对环境变量匹配应忽略大小写。默认情况下,匹配是区分大小写的。
  • delay:是否将环境变量的查找从编译时间延迟到运行时间。默认情况下,在编译时执行查找
  • file_path:读取以添加一些环境变量的文件路径(例如 .env)。默认情况下,未设置
  • prefix:在匹配环境变量之前添加到结构体字段名称的前缀。默认情况下,未设置

字段

当前支持的字段参数为

  • default:如果未找到环境变量时使用的默认值。默认情况下,未设置
  • skip:是否跳过环境变量的解析。如果指定的类型未实现 std::str::FromStr,则是必要的。
  • variable:用于查找的环境变量。默认情况下,字段名称

变量解析层次结构

  1. 传递给 new 方法的参数(如果使用 new)。
  2. 环境变量
  3. 从文件中加载的变量(例如 .env
  4. 默认值

贡献

在开始贡献工作之前,请阅读

运行测试

测试时运行

cargo test -- --test-threads=1

以防止测试相互竞争同一文件

许可协议

本项目的许可协议为 MIT 或 Apache 2.0 许可协议。

依赖项

~325–780KB
~18K SLoC