Rust config crate如何从编译期静态字符串加载配置
问题描述
使用 Rust config crate 时,需要将原有运行时从文件加载配置的逻辑,切换为读取编译期生成的静态配置字符串。
原有可正常运行的文件加载代码:
config::Config::builder().add_source(File::new("default.toml", FileFormat::Toml));
直接传入 include_str! 生成的静态字符串时编译失败,问题代码:
static DEFAULT: &str = std::include_str!("./default.toml"); // ... config::Config::builder().add_source(DEFAULT)
编译报错信息:
error[E0277]: the trait bound `&str: Source` is not satisfied --> src/config.rs:21:25 | 21 | .add_source(DEFAULT) | ---------- ^^^^^^^ the trait `Source` is not implemented for `&str` | | | required by a bound introduced by this call | note: required by a bound in `ConfigBuilder::<DefaultState>::add_source` --> /home/konrad/.cargo/registry/src/github.com-1ecc6299db9ec823/config-0.13.1/src/builder.rs:207:12 | 207 | T: Source + Send + Sync + 'static, | ^^^^^^ required by this bound in `ConfigBuilder::<DefaultState>::add_source`
解决方案
add_source 方法的入参必须实现 Source trait,裸 &str 未实现该 trait,因此无法直接传入。config crate 内置了内存字符串的配置源包装能力,针对 TOML 格式的静态字符串,调用 File::from_str 方法传入静态字符串、指定对应配置格式即可,该方法返回值已实现 Source trait,可直接传入 add_source。
正确实现代码:
// 编译期将default.toml内容嵌入二进制文件 static DEFAULT: &str = std::include_str!("./default.toml"); let config = config::Config::builder() .add_source(config::File::from_str(DEFAULT, config::FileFormat::Toml)) .build()?;
该写法和原有文件加载逻辑完全兼容,后续配置解析、结构体映射的代码无需修改。传入的 &'static str 生命周期与程序运行周期一致,完全满足 Source trait 要求的 Send + Sync + 'static 约束,不会产生生命周期问题。
内容的提问来源于stack exchange,提问作者Konrad Höffner
相关产品推荐
相关产品推荐

