27 个版本 (13 个稳定版)

2.2.4 2023年11月28日
2.2.1 2023年10月27日
2.0.0 2023年7月9日
1.2.0 2023年5月25日
0.1.4 2020年12月21日

#67 in 编码

Download history 6796/week @ 2024-04-11 7309/week @ 2024-04-18 7107/week @ 2024-04-25 6967/week @ 2024-05-02 6604/week @ 2024-05-09 6542/week @ 2024-05-16 7285/week @ 2024-05-23 7866/week @ 2024-05-30 6768/week @ 2024-06-06 6355/week @ 2024-06-13 4931/week @ 2024-06-20 5587/week @ 2024-06-27 5657/week @ 2024-07-04 4158/week @ 2024-07-11 4022/week @ 2024-07-18 3738/week @ 2024-07-25

18,350 monthly downloads
27 crate 使用 (14 个直接使用)

MIT 许可

51KB
1K SLoC

MIT Latest Version docs Chat on Miaou

deser_hjson

这是一个为 Hjson 定制的 Serde 反序列化器,适用于 derive 驱动的反序列化。

Hjson 是一种良好的配置文件语言。这样的文件应该由人类编写,由其他人类读取和修改,然后由程序反序列化为精确的结构。

let file_content = fs::read_to_string(&file_path)?;
let configuration = deser_hjson::from_str(&file_content);

如果配置文件无效或与预期类型不匹配,错误将详细说明预期内容和错误精确位置。

示例

use {
    deser_hjson::*,
    serde::Deserialize,
    std::collections::HashMap,
};
// This Hjson document comes from https://hjson.github.io/
let hjson = r#"
// use #, // or /**/ for comments,
// omit quotes for keys
key: 1
// omit quotes for strings
contains: everything on this line
// omit commas at the end of a line
cool: {
  foo: 1
  bar: 2
}
// allow trailing commas
list: [
  1,
  2,
]
// and use multiline strings
realist:
  '''
  My half empty glass,
  I will fill your empty half.
  Now you are half full.
  '''
"#;
// we'll deserialize it into this struct:
#[derive(Deserialize, PartialEq, Debug)]
struct Example {
    key: i32,
    contains: Option<String>,
    cool: HashMap<String, u16>,
    list: Vec<usize>,
    realist: String,
    missing: Option<f64>,
}
let mut cool = HashMap::new();
cool.insert("foo".to_owned(), 1);
cool.insert("bar".to_owned(), 2);
let expected = Example {
    key: 1,
    contains: Some("everything on this line".to_owned()),
    cool,
    list: vec![1, 2],
    realist: "My half empty glass,\nI will fill your empty half.\nNow you are half full.".to_owned(),
    missing: None,
};
// Here's the deserialization and the equality check:
assert_eq!(expected, from_str(hjson).unwrap());

已知的开源使用案例

  • Broot 可以使用 TOML 或 Hjson 进行配置(选择是动态的,基于文件扩展名)。

  • lemmy 使用 Hjson 进行配置

  • Resc 可以使用 JSON 或 Hjson 进行配置

常见问题解答

它支持 JSON 吗?

是的,任何 JSON 文件都可以被读取为 Hjson。

为什么只支持基于 derive 的反序列化器?

在具有隐式类型格式的格式中猜测类型是非常危险的。当您的用户输入 false 时,它是字符串还是布尔值?当她输入 3 时,它是字符串还是数字?虽然 Hjson 不像 YAML 那样疯狂,但它没有内部保护措施来处理这种情况,因此应该只将 Hjson 反序列化为显式类型。

为什么只提供反序列化器而不是序列化器?

Hjson 不是一个数据交换格式。它旨在由人类编写,包含大量注释,并具有有意义的格式。虽然在某些情况下序列化器是有意义的,但它们必须是基于模板的,或者提供其他方式来指定注释和格式,而 serde 不是实现这一目标的正确工具。

依赖关系

~0.4–1MB
~23K SLoC