#configuration #hocon #read #reading-file

hocon-linked

读取 HOCON 配置文件

1 个不稳定版本

0.5.3-dev2021年11月1日

#2728解析器实现

MIT 许可证

175KB
4K SLoC

HOCON.rs License: MIT Release Doc Crate

主分支的 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 将数据反序列化为实现 Deserializestruct

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