【问题标题】:How to create a TOML file from Rust?如何从 Rust 创建 TOML 文件?
【发布时间】:2019-06-19 22:32:49
【问题描述】:

我已将所有数据收集到一个向量中,我需要使用该数据创建一个 TOML 文件。我已经成功创建并打开了一个文件:

let mut file = try!(File::create("servers.toml"));

我的vector<(string,(string, u32))> 包含以下数据,在 TOML 中应如下所示。

[server.A]
Ipaddr="192.168.4.1"
Port no=4476

[server.B]
......

我有很多数据需要用 TOML 编写,我知道 TOML 是一个文本文件。编码器是怎么用的?

【问题讨论】:

  • 欢迎来到 Stack Overflow!请edit您的问题向我们展示您的尝试; it's expected that you show a good amount of effort 提问时;这不是人们免费为您编写代码的服务!
  • 还要注意vector<(string,(string, u32))> 不是一个有效的类型,至少使用标准库是这样。如果您使用标准库中未找到的类型,则需要将其包含在您的问题中。您应该提供一个minimal reproducible example,以便人们更好地了解您的问题并为您提供帮助。

标签: rust toml


【解决方案1】:

这使用TOML crate 进行结构和序列化。主要好处是值应该被正确转义。

use std::fs;
use toml::{map::Map, Value}; // 0.5.1

fn to_toml(v: Vec<(String, (String, u32))>) -> Value {
    let mut servers = Map::new();
    for (name, (ip_addr, port)) in v {
        let mut server = Map::new();
        server.insert("Ipaddr".into(), Value::String(ip_addr));
        server.insert("Port no".into(), Value::Integer(port as i64));
        servers.insert(name, Value::Table(server));
    }

    let mut map = Map::new();
    map.insert("server".into(), Value::Table(servers));
    Value::Table(map)
}

fn main() {
    let v = vec![
        ("A".into(), ("192.168.4.1".into(), 4476)),
        ("B".into(), ("192.168.4.8".into(), 1234)),
    ];

    let toml_string = toml::to_string(&to_toml(v)).expect("Could not encode TOML value");
    println!("{}", toml_string);

    fs::write("servers.toml", toml_string).expect("Could not write to file!");
}

您也可以将其与Serde 的自动序列化和反序列化一起使用,以避免处理低级细节:

use serde::Serialize; // 1.0.91
use std::{collections::BTreeMap, fs};
use toml; // 0.5.1

#[derive(Debug, Default, Serialize)]
struct Servers<'a> {
    servers: BTreeMap<&'a str, Server<'a>>,
}

#[derive(Debug, Serialize)]
struct Server<'a> {
    #[serde(rename = "Ipaddr")]
    ip_addr: &'a str,

    #[serde(rename = "Port no")]
    port_no: i64,
}

fn main() {
    let mut file = Servers::default();
    file.servers.insert(
        "A",
        Server {
            ip_addr: "192.168.4.1",
            port_no: 4476,
        },
    );
    file.servers.insert(
        "B",
        Server {
            ip_addr: "192.168.4.8",
            port_no: 1234,
        },
    );

    let toml_string = toml::to_string(&file).expect("Could not encode TOML value");
    println!("{}", toml_string);
    fs::write("servers.toml", toml_string).expect("Could not write to file!");
}

【讨论】:

    猜你喜欢
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多