rust - 如何将环境变量中的配置值反序列化为Vec?

标签 rust config serde

我正在尝试使用Rust的config crate 来处理包含Vec<String>类型的字段的配置结构。我可以定义我的结构,并且所有内容都可以编译,但是我似乎无法使用环境变量来设置值-似乎默认环境变量反序列化将我的输入视为单个字符串而不是Vec,所以出现了invalid type: string "[\"a\",\"b\"]", expected a sequence错误。
这是一个最小的例子

// Cargo.toml

[package]
name = "min_config"
version = "0.1.0"

[dependencies]
config = "0.10.1"
serde = { version = "1.0.117", features = ["derive"] }
// src/main.rs

extern crate config;
extern crate serde;

use config::{Config, ConfigError, Environment};
use serde::Deserialize;

#[derive(Debug, Deserialize)]
pub struct MyConfig {
    pub strs: Vec<String>,
}

impl MyConfig {
    pub fn from_env() -> Result<Self, ConfigError> {
        let mut s = Config::new();
        s.merge(Environment::with_prefix("CFG"))?;
        s.try_into()
    }
}

pub fn main() {
    let cfg = MyConfig::from_env().unwrap();
}
运行代码:
$ CFG_STRS='["a","b"]' cargo run
   Compiling min_config v0.1.0 (/Users/greg/Code/rust/min_config)
    Finished dev [unoptimized + debuginfo] target(s) in 0.71s
     Running `target/debug/min_config`
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: invalid type: string "[\"a\",\"b\"]", expected a sequence', src/main.rs:21:13
如何传递环境变量,使serde能够识别出它是Vec<String>,而不仅仅是String

最佳答案

Config使用JSON解析文件,但不解析环境变量。不幸的是,基于this issue,似乎没有一种方法可以从环境中读取数组。

关于rust - 如何将环境变量中的配置值反序列化为Vec?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64848972/

相关文章:

xml - 解析文件返回错误 "thread ' main' paniced"

rust - 如何在自定义序列化和反序列化中使用 "flatten"之类的东西

generics - 使用泛型类型时如何使用整数文字?

rust - 为什么Rust阻止为外部结构实现外部特征?

rust - 找不到命令: wrangler

macos - 如何在终端中使用 IntelliJ 捆绑的 maven?

sockets - "Can' t 分配请求的地址“发送到 UdpSocket 时

rust - 如何在Rust中的定位索引处获取位值?

unit-testing - 在域对象约束中使用 grails 配置值

rust - 函数返回 serde 反序列化类型时如何修复生命周期错误?