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 编码

Download history 447/week @ 2024-04-30 327/week @ 2024-05-07 752/week @ 2024-05-14 1344/week @ 2024-05-21 1012/week @ 2024-05-28 407/week @ 2024-06-04 679/week @ 2024-06-11 561/week @ 2024-06-18 432/week @ 2024-06-25 479/week @ 2024-07-02 939/week @ 2024-07-09 1308/week @ 2024-07-16 2734/week @ 2024-07-23 1713/week @ 2024-07-30 769/week @ 2024-08-06 1299/week @ 2024-08-13

6,813 每月下载量
用于 45 个crate(34 个直接使用)

MIT/Apache

785KB
18K SLoC

hcl-rs

Build Status crates.io docs.rs License: Apache 2.0 License: MIT

一个用于与Hashicorp配置语言(HCL)交互的Rust库。

功能

  • HCL语法规范解析器(HCL语法规范)
  • 所有HCL结构的类型,例如body、blocks和attributes
  • 支持宏,如body!,用于构建HCL数据结构
  • 支持在属性值中使用表达式模板子语言
  • 支持反序列化和序列化实现serde::Deserializeserde::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.0MIT 许可证

依赖关系

~2.2–3MB
~57K SLoC