如何在Rust中使用toml-rs库捕获TOML文件中的所有表
解决toml-rs动态捕获所有顶层表的问题
你可以通过Serde的#[serde(flatten)]属性配合HashMap来实现动态捕获所有顶层表,无需手动添加每个用户字段。具体修改如下:
修改后的代码
use serde::Deserialize; use std::collections::HashMap; use toml; #[derive(Debug, Deserialize)] struct Config { active_users: Vec<String>, #[serde(flatten)] users: HashMap<String, User>, } #[derive(Debug, Deserialize)] struct User { name: String, } fn main() { let toml_str = r#" active_users = ["john", "new2rust"] [john] name = "John Doe" [new2rust] name = "Jane Doe" [randomguy] name = "Rust Guy" "#; let decoded: Config = toml::from_str(toml_str).unwrap(); println!("{:#?}", decoded); }
关键说明
#[serde(flatten)]:这个属性会告诉Serde将所有未匹配到结构体显式字段的键值对(这里就是所有顶层用户表)“扁平化”到修饰的字段中。HashMap<String, User>:用字符串作为键(对应TOML里的表名,如john),User结构体作为值,完美适配动态变化的用户表。
运行输出
Config { active_users: [ "john", "new2rust", ], users: { "john": User { name: "John Doe" }, "new2rust": User { name: "Jane Doe" }, "randomguy": User { name: "Rust Guy" } } }
这个方案完全适配配置的频繁更新,新增用户表后无需修改结构体代码,Serde会自动将其捕获到HashMap中。
内容的提问来源于stack exchange,提问作者cthu
相关产品推荐
相关产品推荐

