1 个不稳定版本
0.5.3-dev | 2021年11月1日 |
---|
#2728 在 解析器实现
175KB
4K SLoC
HOCON.rs
主分支的 API 文档发布在此处 here。
根据 HOCON 规范,在 Rust 中解析 HOCON 配置文件。
此实现的目的是尽可能宽容,返回包含所有错误的有效文档,错误被封装在 Hocon::BadValue
中。可以通过启用 strict
模式来返回遇到的第一个 Error
。
示例
使用 serde 解析字符串到结构体
use serde::Deserialize;
#[derive(Deserialize)]
struct Configuration {
host: String,
port: u8,
auto_connect: bool,
}
fn main() -> Result<(), Error> {
let s = r#"{
host: 127.0.0.1
port: 80
auto_connect: false
}"#;
let conf: Configuration = hocon::de::from_str(s)?;
Ok(())
}
从字符串中读取并直接获取值
use hocon::HoconLoader;
fn main() -> Result<(), Error> {
let s = r#"{ a: 7 }"#;
let doc = HoconLoader::new()
.load_str(s)?
.hocon()?;
let a = doc["a"].as_i64();
assert_eq!(a, Some(7));
Ok(())
}
使用 serde
解析到结构体
use serde::Deserialize;
use hocon::HoconLoader;
#[derive(Deserialize)]
struct Configuration {
host: String,
port: u8,
auto_connect: bool,
}
fn main() -> Result<(), Error> {
let s = r#"{
host: 127.0.0.1
port: 80
auto_connect: false
}"#;
let conf: Configuration = HoconLoader::new()
.load_str(s)?
.resolve()?;
Ok(())
}
从文件中读取
use hocon::HoconLoader;
fn main() -> Result<(), Error> {
let doc = HoconLoader::new()
.load_file("tests/data/basic.conf")?
.hocon()?;
let a = doc["a"].as_i64();
assert_eq!(a, Some(5));
Ok(())
}
从多个文档中读取
use hocon::HoconLoader;
fn main() -> Result<(), Error> {
let s = r#"{
a: will be changed
unchanged: original value
}"#;
let doc = HoconLoader::new()
.load_str(s)?
.load_file("tests/data/basic.conf")?
.hocon()?;
let a = doc["a"].as_i64();
assert_eq!(a, Some(5));
let unchanged = doc["unchanged"].as_string();
assert_eq!(unchanged, Some(String::from("original value")));
Ok(())
}
功能
默认启用所有功能。可以通过禁用它们来减少依赖项。
url-support
此功能启用在 include url("http://mydomain.com/myfile.conf")
中获取 URL 包含(参见 规范)。如果禁用,则包含只会加载使用 include "path/to/file.conf"
或 include file("path/to/file.conf")
指定的本地文件。
serde-support
此功能启用使用 serde
将数据反序列化为实现 Deserialize
的 struct
。
use serde::Deserialize;
use hocon::HoconLoader;
#[derive(Deserialize)]
struct Configuration {
host: String,
port: u8,
auto_connect: bool,
}
# fn main() -> Result<(), Error> {
let s = r#"{host: 127.0.0.1, port: 80, auto_connect: false}"#;
# #[cfg(feature = "serde-support")]
let conf: Configuration = HoconLoader::new().load_str(s)?.resolve()?;
# Ok(())
# }
规范覆盖率
https://github.com/lightbend/config/blob/master/HOCON.md
- 解析 JSON
- 注释
- 省略根花括号
- 键值分隔符
- 如果存在换行符,逗号是可选的
- 空白字符
- 重复键和对象合并
- 未引用的字符串
- 多行字符串
- 值连接
- 对象连接
- 数组连接
- 路径表达式
- 路径作为键
- 替换
- 包含
- 将数字索引对象转换为数组
- 允许包含文件的URL
- 持续时间单位格式
- 周期单位格式
- 大小单位格式
依赖项
~6–23MB
~307K SLoC