飞道的博客

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

531人阅读  评论(0)

toml

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

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

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


   
  1. [ package]
  2. name = "toml"
  3. version = "0.4.2"
  4. authors = [ "Alex Crichton <alex@alexcrichton.com>"]
  5. [dependencies]
  6. serde = "1.0"

使用 TOML 格式文件管理配置是整个 Rust 社区中相对普遍的实践,尤其是 Rust 的软件包管理器 Cargo 使用的格式。

TOML 值

在这个 crate 中,TOML中的值用Value枚举来表示:


   
  1. pub enum Value {
  2.     String(String),
  3.     Integer(i64),
  4.     Float(f64),
  5.     Boolean( bool),
  6.     Datetime(Datetime),
  7.     Array(Array),
  8.     Table(Table),
  9. }

TOML与JSON类似,但增加了重要的Datetime类型。通常,TOML和JSON在格式方面可以互换。

解析 TOML 文件

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


   
  1. use toml::Value;
  2. let value =  "foo = 'bar'".parse::<Value>().unwrap();
  3. 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 DeserializeSerializeDeserializer, and Serializer traits. Namely, you'll find:

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

  • Value的反序列化

  • Value的序列化

  • Datetime的反序列化

  • Datetime的序列化

  • de::Deserializer的反序列化

  • ser::Serializer的序列化

  • Value反序列化器

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

反序列化TOML的用例:


   
  1. use serde_derive::Deserialize;
  2. #[derive(Deserialize)]
  3. struct Config {
  4.     ip: String,
  5.     port: Option<u16>,
  6.     keys: Keys,
  7. }
  8. #[derive(Deserialize)]
  9. struct Keys {
  10.     github: String,
  11.     travis: Option<String>,
  12. }
  13. fn main() {
  14.     let config: Config = toml::from_str(r# "
  15.         ip = '127.0.0.1'
  16.         [keys]
  17.         github = 'xxxxxxxxxxxxxxxxx'
  18.         travis = 'yyyyyyyyyyyyyyyyy'
  19.     "#).unwrap();
  20.     assert_eq!(config.ip,  "127.0.0.1");
  21.     assert_eq!(config.port, None);
  22.     assert_eq!(config.keys.github,  "xxxxxxxxxxxxxxxxx");
  23.     assert_eq!(config.keys.travis.as_ref().unwrap(),  "yyyyyyyyyyyyyyyyy");
  24. }

你可以用类似的方式序列化这些类型:


   
  1. use serde_derive::Serialize;
  2. #[derive(Serialize)]
  3. struct Config {
  4.     ip: String,
  5.     port: Option<u16>,
  6.     keys: Keys,
  7. }
  8. #[derive(Serialize)]
  9. struct Keys {
  10.     github: String,
  11.     travis: Option<String>,
  12. }
  13. fn main() {
  14.     let config = Config {
  15.         ip:  "127.0.0.1".to_string(),
  16.         port: None,
  17.         keys: Keys {
  18.             github:  "xxxxxxxxxxxxxxxxx".to_string(),
  19.             travis: Some( "yyyyyyyyyyyyyyyyy".to_string()),
  20.         },
  21.     };
  22.     let toml = toml::to_string(&config).unwrap();
  23. }

转载:https://blog.csdn.net/u012067469/article/details/108806609
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场