18 个不稳定版本 (7 个重大变化)

0.9.0 2022年4月25日
0.7.0 2021年11月10日
0.5.2 2021年5月19日
0.5.1 2021年3月10日
0.3.0 2019年3月7日

#16 in #strict

Download history 344/week @ 2024-03-11 402/week @ 2024-03-18 423/week @ 2024-03-25 441/week @ 2024-04-01 323/week @ 2024-04-08 382/week @ 2024-04-15 302/week @ 2024-04-22 281/week @ 2024-04-29 280/week @ 2024-05-06 227/week @ 2024-05-13 235/week @ 2024-05-20 261/week @ 2024-05-27 189/week @ 2024-06-03 111/week @ 2024-06-10 235/week @ 2024-06-17 208/week @ 2024-06-24

每月757次下载
用于 11 个软件包 (8 个直接使用)

MIT 许可协议

180KB
4K SLoC

HOCON.rs License: MIT Release Doc Crate

主分支的 API 文档发布 在此

遵循 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
  • 持续时间单位格式
  • 周期单位格式
  • 大小单位格式

依赖

~7–23MB
~316K SLoC