toml crate 如何构建类似依赖项的结构

问题描述

我有一个形式为的 toml 文件

[general]

loaded=true
can_reload=true

[dependencies]

dependencies 部分的工作方式与 Cargo.toml 依赖项基本相同,每个依赖项都在单独的行中列出。

问题是,当使用 toml crate 对其进行序列化/反序列化时,我不确定如何指定一个部分,该部分可以包含任意数量的条目,其下方具有任意名称

我的结构目前看起来像:

#[derive(Debug,Serialize,Deserialize)]
pub struct Configuration {
    general: ConfigurationGeneral,}

#[derive(Debug,Deserialize)]
pub struct ConfigurationGeneral {
    loaded: bool,can_reload: bool,}

我在文档中看到您可以使用 Option 但这仍然仅适用于单个值。我无法知道依赖项的名称以及将它们添加到结构中的数量

解决方法

dependencies 表示 HashMap

use std::collections::HashMap;

use serde::{Serialize,Deserialize}; // 1.0.126
use toml; // 0.5.8

#[derive(Debug,Serialize,Deserialize)]
pub struct Configuration {
    general: ConfigurationGeneral,dependencies: HashMap<String,String>,}

#[derive(Debug,Deserialize)]
pub struct ConfigurationGeneral {
    loaded: bool,can_reload: bool,}

fn main() {
    let config: Configuration = toml::from_str(r#"
        [general]
        loaded = true
        can_reload = true
        
        [dependencies]
        toml = "1.4"
    "#).unwrap();
    
    println!("{:#?}",config);
}

playground 上查看。

这里我只是将依赖项解析为 String 的值,但它们当然也可以是更复杂的结构。