hcl-rs

Build Status docs.rs MIT License

This crate provides functionality to deserialize, serialize and manipulate HCL data.

The main types are Deserializer for deserializing data, Serializer for serialization. Furthermore the provided Body and Value types can be used to construct HCL data or as a deserialization target.

Deserialization examples

Deserialize arbitrary HCL according to the HCL JSON Specification:

```rust 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!({ "someattr": { "foo": [1, 2], "bar": true }, "someblock": { "someblocklabel": { "attr": "value" } } });

let value: Value = hcl::from_str(input).unwrap();

assert_eq!(value, expected); ```

If you need to preserve context about the HCL structure, deserialize into hcl::Body instead:

```rust 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() .addattribute(( "someattr", Expression::fromiter([ ("foo", Expression::from(vec![1, 2])), ("bar", Expression::Bool(true)), ]), )) .addblock( Block::builder("someblock") .addlabel("someblocklabel") .add_attribute(("attr", "value")) .build(), ) .build();

let body: Body = hcl::from_str(input).unwrap();

assert_eq!(body, expected); ```

Serialization examples

A simple example to serialize some terraform configuration:

```rust use hcl::{Block, Body, RawExpression};

let body = Body::builder() .addblock( Block::builder("resource") .addlabel("awssnstopicsubscription") .addlabel("topic") .addattribute(("topicarn", RawExpression::new("awssnstopic.queue.arn"))) .addattribute(("protocol", "sqs")) .addattribute(("endpoint", RawExpression::new("awssqsqueue.queue.arn"))) .build(), ) .build();

let expected = r#" resource "awssnstopicsubscription" "topic" { topicarn = awssnstopic.queue.arn protocol = "sqs" endpoint = awssqsqueue.queue.arn } "#.trim_start();

let serialized = hcl::to_string(&body).unwrap();

assert_eq!(serialized, expected); ```

Also have a look at the other examples provided in the documentation of the ser module.

License

The source code of hcl-rs is released under the MIT License. See the bundled LICENSE file for details.