#env-var #variables #environment #serde #structs #structure #load

enveror

使用serde将环境变量加载到结构体的库

9个版本

0.1.8 2024年8月5日
0.1.7 2024年8月5日
0.1.6 2023年11月25日

#618编码

Download history 5/week @ 2024-07-01 28/week @ 2024-07-29 220/week @ 2024-08-05

每月248次下载

MIT 许可证

15KB
357

enveror

github crates.io docs.rs

结构化环境变量的库

功能

  • 使用.表示env-vals的结构
  • 使用serdeenveror中定义环境变量的结构
  • 每个变量(无对象)都在单行内完全定义

示例

config

如果你想定义以下结构,

{
  "STAGE": "dev",
  "CLOUD": {
    "API_KEY_ID": "hogehoge=hog",
    "API_SECRET_KEY": "fug+;l[l;uw:er-0-63-096z,nxvcafuga",
    "STORAGE": {
      "IMAGES": "myimages"
    }
  },
  "CORS_ORIGINS": ["https://127.0.0.1:3000", "", "https://enveror.example.com"],
  "WORKER_COUNT": 4,
  "TIMEOUT_SECONDS": 2.3,
  "EMPTY_STRING": " ",
  "SAMPLE": true,
  "CONFIG": {
    "FLAGS": [true, false, false, true],
    "NUMBERS": [1, 2, 3, 4, 5, 6, 7, 8, 9]
  }
}

你可以设置以下环境变量。

STAGE="dev"
CLOUD.API_KEY_ID="hogehoge=hog"
CLOUD.API_SECRET_KEY="fug+;l[l;uw:er\-0-63-096z,nxvcafuga"
CLOUD.STORAGE.IMAGES="myimages"
CORS_ORIGINS=["https://127.0.0.1:3000", "", "https://enveror.example.com"]
WORKER_COUNT=4
TIMEOUT_SECONDS=2.3
EMPTY_STRING=" "
SAMPLE=true
CONFIG.FLAGS=[true, false, false, true]
CONFIG.NUMBERS=[1, 2, 3, 4, 5, 6, 7, 8, 9]

代码

以下是对解析和反序列化的测试代码。

use std::path::PathBuf;

use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
enum Stage {
    Dev,
    Prod,
}

#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
struct EnverorConfig {
    stage: Stage,
    cloud: Cloud,
    cors_origins: Vec<String>,
    worker_count: u8,
    timeout_seconds: f32,
    empty_string: String,
    sample: bool,
}

#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
struct Cloud {
    api_key_id: String,
    api_secret_key: String,
    storage: CloudStorage,
}

#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
struct CloudStorage {
    images: String,
}

extern crate enveror;

#[test]
fn parse_deserialize() -> Result<(), Box<dyn std::error::Error>> {
    enveror::Enveror::new()
        .ignore_default_config()
        .path(PathBuf::from("./tests/case_enveror"))
        .load()?
        .construct::<EnverorConfig>()?;
    Ok(())
}

依赖项

~0.7–1.6MB
~35K SLoC