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

env-settings-derive

使用环境变量初始化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日

#167 in #环境变量

Download history 25/week @ 2024-03-11 41/week @ 2024-03-18 31/week @ 2024-03-25 101/week @ 2024-04-01 119/week @ 2024-04-08 35/week @ 2024-04-15 94/week @ 2024-04-22 200/week @ 2024-04-29 4/week @ 2024-05-06 37/week @ 2024-05-20 95/week @ 2024-05-27 58/week @ 2024-06-10 47/week @ 2024-06-17 73/week @ 2024-06-24

每月179次下载
用于env-settings

MIT/Apache

39KB
509

环境设置

Env Settings

crates license validate

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

此Rust库受到了pydanticBaseSettings Python类的启发

安装

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

用法

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

  • 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 许可证的约束。

依赖项

~335–800KB
~19K SLoC