toml
一个 TOML 文件解析库,灵活的配置管理是大多数程序都需要的功能,使用配置文件可以让程序更加灵活,更方便适应不同的使用情况、运行环境等等。这次的toml解析器就可以协助程序的配置管理。
本库实现了 TOML v0.5.0 版本兼容的解析器,主要支持 serde 库,用来在 Rust 中编码、解码各种类型。
TOML本身是一种简单、简洁且高效、可读性强的配置格式:
-
[
package]
-
name =
"toml"
-
version =
"0.4.2"
-
authors = [
"Alex Crichton <alex@alexcrichton.com>"]
-
-
[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
。
反序列化和序列化
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<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();
-
}
转载:https://blog.csdn.net/u012067469/article/details/108806609