首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Rust中的toml-rs库捕获TOML文件中的所有表

如何用Rust中的toml-rs库捕获TOML文件中的所有表
EN

Stack Overflow用户
提问于 2022-09-16 05:57:25
回答 1查看 61关注 0票数 2

新来的铁锈!目前,我正在使用TOML库来读取TOML配置.

请参阅我在铁锈游乐场上的代码

下面是我从toml示例/decde.rs中获取的代码,并更新了代码

代码语言:javascript
复制
use serde::Deserialize;
use toml;

#[derive(Debug, Deserialize)]
struct Config {
    active_users: Vec<String>,
    // john: Option<User>, - i don't want to manually add each line for all tables
}

#[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);
}

输出

代码语言:javascript
复制
Config {
    active_users: [
        "john",
        "new2rust",
    ],
}

我想要的输出是这样的

代码语言:javascript
复制
Config {
    active_users: [
        "john",
        "new2rust",
    ],
    john: ...,
    new2rust: ...,
    randomguy: ...,
}

我不想手动将所有其他表的每一行john: Option<User>添加到Config中,因为配置将经常更新。因此,我不知道如何捕获所有的表,并将它们添加到Config中。

EN

回答 1

Stack Overflow用户

发布于 2022-09-16 06:19:08

确实有一种方法可以做你所描述的事情,但这并不是必要的,也不是一个好主意。

正如注释中提到的,您基本上是在硬编码您的用户,因为他们是他们在结构中的自己的字段。与其滥用文件中的其余表,不如使用一个表数组(https://toml.io/en/v1.0.0#array-of-tables)。

如前所述,你可以使用serde的扁平,但这不是你想要的,诚实地说,只是引导你走错了道路,同时尝试学习锈。

那么您的标记将如下所示:

代码语言:javascript
复制
active_users = [ { name = "john" }, { name = "new2rust" } ]

反序列化结构如下所示:

代码语言:javascript
复制
#[derive(Debug, Deserialize)]
struct User {
    name: String,
}

#[derive(Debug, Deserialize)]
struct Config {
    active_users: Vec<User>,
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73740451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档