如何将环境变量中的配置值反序列化为 Vec?
How do I deserialize a configuration value from an environment variable as a Vec?
我正在尝试使用 Rust 的 config 板条箱来处理包含类型为 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 的 config 板条箱来处理包含类型为 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,似乎没有办法从环境中读取数组。