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.
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); ```
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.
The source code of hcl-rs is released under the MIT License. See the bundled LICENSE file for details.