65次发布
0.18.0 | 2024年5月24日 |
---|---|
0.16.9 | 2024年4月13日 |
0.16.7 | 2024年1月4日 |
0.16.6 | 2023年9月27日 |
0.3.3 | 2022年3月26日 |
#66 in 编码
6,813 每月下载量
用于 45 个crate(34 个直接使用)
785KB
18K SLoC
hcl-rs
一个用于与Hashicorp配置语言(HCL)交互的Rust库。
功能
- HCL语法规范解析器(HCL语法规范)
- 所有HCL结构的类型,例如body、blocks和attributes
- 支持宏,如
body!
,用于构建HCL数据结构 - 支持在属性值中使用表达式和模板子语言
- 支持反序列化和序列化实现
serde::Deserialize
或serde::Serialize
的任意类型 - HCL表达式和模板子语言的评估
Cargo特性
perf
:启用解析器性能优化,例如在堆栈上内联小字符串。默认情况下禁用此功能。
反序列化示例
根据HCL JSON规范反序列化任意HCL
use serde_json::{json, Value};
let input = r#"
some_attr = {
foo = [1, 2]
bar = true
}
some_block "some_block_label" {
attr = "value"
}
"#;
let expected = json!({
"some_attr": {
"foo": [1, 2],
"bar": true
},
"some_block": {
"some_block_label": {
"attr": "value"
}
}
});
let value: Value = hcl::from_str(input).unwrap();
assert_eq!(value, expected);
如果需要保留关于HCL结构的上下文信息,请将反序列化到hcl::Body
use hcl::{Block, Body, Expression};
let input = r#"
some_attr = {
"foo" = [1, 2]
"bar" = true
}
some_block "some_block_label" {
attr = "value"
}
"#;
let expected = Body::builder()
.add_attribute((
"some_attr",
Expression::from_iter([
("foo", Expression::from(vec![1, 2])),
("bar", Expression::Bool(true)),
]),
))
.add_block(
Block::builder("some_block")
.add_label("some_block_label")
.add_attribute(("attr", "value"))
.build(),
)
.build();
let body: Body = hcl::from_str(input).unwrap();
assert_eq!(body, expected);
序列化示例
序列化一些Terraform配置的示例
use hcl::expr::Traversal;
use hcl::{Block, Body, Variable};
let body = Body::builder()
.add_block(
Block::builder("resource")
.add_label("aws_sns_topic_subscription")
.add_label("my-subscription")
.add_attribute((
"topic_arn",
Traversal::builder(Variable::new("aws_sns_topic").unwrap())
.attr("my-topic")
.attr("arn")
.build(),
))
.add_attribute(("protocol", "sqs"))
.add_attribute((
"endpoint",
Traversal::builder(Variable::new("aws_sqs_queue").unwrap())
.attr("my-queue")
.attr("arn")
.build(),
))
.build(),
)
.build();
let expected = r#"
resource "aws_sns_topic_subscription" "my-subscription" {
topic_arn = aws_sns_topic.my-topic.arn
protocol = "sqs"
endpoint = aws_sqs_queue.my-queue.arn
}
"#.trim_start();
let serialized = hcl::to_string(&body).unwrap();
assert_eq!(serialized, expected);
还可以查看ser
模块的文档中提供的其他示例,以了解如何在序列化自定义类型时构建HCL块。
表达式评估
eval
模块文档包含更多关于表达式和模板评估的详细信息,但这里有一个非常简单的示例
use hcl::Value;
use hcl::eval::{Context, Evaluate};
use hcl::expr::TemplateExpr;
let expr = TemplateExpr::from("Hello ${name}!");
let mut ctx = Context::new();
ctx.declare_var("name", "World");
assert_eq!(expr.evaluate(&ctx).unwrap(), Value::from("Hello World!"));
宏
此crate提供了一些宏来简化构建HCL数据结构。请参阅它们的文档以获取使用示例。
贡献
欢迎贡献!在创建PR之前,请阅读CONTRIBUTING.md
。
许可
hcl-rs 的源代码根据您的选择,受以下任一许可证的许可:Apache License, Version 2.0 或 MIT 许可证。
依赖关系
~2.2–3MB
~57K SLoC