#toml #serialization #codec #deserialize #native #structures

toml-rsl

一个用于TOML格式文件和流的本地Rust编码和解码器。为TOML数据提供Serialize/Deserialize特质的实现,以方便将Rust结构体反序列化和序列化。

2个版本

0.1.1 2024年3月4日
0.1.0 2024年3月4日

#899 in 编码

每月 23次下载
用于 2 crates

Apache-2.0

250KB
6K SLoC

toml-rs

toml crate的开发已转移到 https://github.com/toml-rs/toml/tree/master/crates/toml

此存储库现已归档。


lib.rs:

一个TOML解析库

此库实现了一个与TOML v0.5.0兼容的解析器,主要支持serde库,用于在Rust中编码/解码各种类型。

TOML本身是一种简单、易用且易于阅读的配置格式

[package]
name = "toml"
version = "0.4.2"
authors = ["Alex Crichton <[email protected]>"]

[dependencies]
serde = "1.0"

TOML格式在Rust社区中相对常见,尤其是在配置方面,值得注意的是它被Rust的包管理器Cargo使用。

TOML值

此crate中的TOML值用Value枚举表示

pub enum Value {
    String(String),
    Integer(i64),
    Float(f64),
    Boolean(bool),
    Datetime(Datetime),
    Array(Array),
    Table(Table),
}

TOML类似于JSON,但增加了Datetime类型。总的来说,TOML和JSON在格式上可以互换。

解析TOML

解析TOML文档最简单的方法是通过Value类型

use toml::Value;

let value = "foo = 'bar'".parse::<Value>().unwrap();

assert_eq!(value["foo"].as_str(), Some("bar"));

Value类型实现了一系列方便的方法和特质;上面的示例使用了FromStr将[str]解析为Value

反序列化和序列化

此crate支持serde 1.0,并实现了一系列的DeserializeSerializeDeserializerSerializer特质。具体来说,你会找到以下内容:

  • 反序列化对于
  • 序列化对于
  • 反序列化对于日期时间
  • 序列化对于日期时间
  • 反序列化器对于 de::反序列化器
  • 序列化器对于 ser::序列化器
  • 反序列化器对于

这意味着您可以使用 Serde 来反序列化/序列化这个crate中的 Value 类型以及 Datetime 类型。您还可以使用 DeserializerSerializerValue 类型本身作为任意类型的反序列化器/序列化器。

使用 TOML 反序列化的示例

use serde_derive::Deserialize;

#[derive(Deserialize)]
struct Config {
    ip: String,
    port: Option<u16>,
    keys: Keys,
}

#[derive(Deserialize)]
struct Keys {
    github: String,
    travis: Option<String>,
}

fn main() {
    let config: Config = toml::from_str(r#"
        ip = '127.0.0.1'

        [keys]
        github = 'xxxxxxxxxxxxxxxxx'
        travis = 'yyyyyyyyyyyyyyyyy'
    "#).unwrap();

    assert_eq!(config.ip, "127.0.0.1");
    assert_eq!(config.port, None);
    assert_eq!(config.keys.github, "xxxxxxxxxxxxxxxxx");
    assert_eq!(config.keys.travis.as_ref().unwrap(), "yyyyyyyyyyyyyyyyy");
}

您可以用类似的方式序列化类型

use serde_derive::Serialize;

#[derive(Serialize)]
struct Config {
    ip: String,
    port: Option<u16>,
    keys: Keys,
}

#[derive(Serialize)]
struct Keys {
    github: String,
    travis: Option<String>,
}

fn main() {
    let config = Config {
        ip: "127.0.0.1".to_string(),
        port: None,
        keys: Keys {
            github: "xxxxxxxxxxxxxxxxx".to_string(),
            travis: Some("yyyyyyyyyyyyyyyyy".to_string()),
        },
    };

    let toml = toml::to_string(&config).unwrap();
}

依赖项

~110–530KB
~11K SLoC