【每周一库】- toml 一个toml文件解析

网友投稿 1545 2022-11-06

【每周一库】- toml 一个toml文件解析库

【每周一库】- toml 一个toml文件解析库

toml

一个 TOML 文件解析库,灵活的配置管理是大多数程序都需要的功能,使用配置文件可以让程序更加灵活,更方便适应不同的使用情况、运行环境等等。这次的toml解析器就可以协助程序的配置管理。

本库实现了 TOML v0.5.0 版本兼容的解析器,主要支持 serde 库,用来在 Rust 中编码、解码各种类型。

TOML本身是一种简单、简洁且高效、可读性强的配置格式:

[package]name = "toml"version = "0.4.2"authors = ["Alex Crichton "][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::().unwrap();assert_eq!(value["foo"].as_str(), Some("bar"));

​​Value​​​类型实现了许多便利的方法和特征;上面的用例中使用了​​FromStr​​​来将​​str​​​解析为​​Value​​。

反序列化和序列化

This crate supports ​​serde​​​ 1.0 with a number of implementations of the ​​Deserialize​​​, ​​Serialize​​​, ​​Deserializer​​​, and ​​Serializer​​ traits. Namely, you'll find:

这个 crate 支持 serde 1.0,包含了一系列的特征实现:​​Deserialize​​​, ​​Serialize​​​, ​​Deserializer​​​, 和 ​​Serializer​​ ,比如:

​​Value​​的反序列化​​Value​​的序列化​​Datetime​​的反序列化​​Datetime​​的序列化​​de::Deserializer​​的反序列化​​ser::Serializer​​的序列化​​Value​​反序列化器

这意味着你可以使用Serde在此crate中反序列化/序列化“值”类型和“日期时间”类型。您也可以使用Deserializer,Serializer或Value类型本身来充当任意类型的反序列化器/序列化器。

反序列化TOML的用例:

use serde_derive::Deserialize;#[derive(Deserialize)]struct Config { ip: String, port: Option, keys: Keys,}#[derive(Deserialize)]struct Keys { github: String, travis: Option,}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, keys: Keys,}#[derive(Serialize)]struct Keys { github: String, travis: Option,}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();}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Hibernate持久化类
下一篇:Mybatis返回map集合时,列的顺序与select不一致问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~