hcl-rs 0.19.7

HCL parser and formatter for rust with serde support
Documentation
use crate::structure::{Attribute, Block, Body, Structure};
use crate::Identifier;
use pretty_assertions::assert_eq;

#[track_caller]
fn assert_body<T>(given: T, expected: Body)
where
    T: serde::Serialize,
{
    assert_eq!(Body::from_serializable(&given).unwrap(), expected);
}

#[test]
fn roundtrip() {
    assert_body(Body::default(), Body::default());
    assert_body(
        Body::builder()
            .add_attribute(("foo", "bar"))
            .add_block(Block::builder("baz").build())
            .build(),
        Body::builder()
            .add_attribute(("foo", "bar"))
            .add_block(Block::builder("baz").build())
            .build(),
    );
    assert_body(
        Structure::Block(
            Block::builder("foo")
                .add_label("bar")
                .add_label(Identifier::unchecked("bar"))
                .add_attribute(("baz", "qux"))
                .build(),
        ),
        Block::builder("foo")
            .add_label("bar")
            .add_label(Identifier::unchecked("bar"))
            .add_attribute(("baz", "qux"))
            .build()
            .into(),
    );
}

#[test]
fn builtin() {
    assert_body(
        Attribute::new("foo", "bar"),
        Attribute::new("foo", "bar").into(),
    );
    assert_body(
        Attribute::new("foo", vec!["bar", "baz"]),
        Attribute::new("foo", vec!["bar", "baz"]).into(),
    );
    assert_body(
        Block::builder("foo")
            .add_label("bar")
            .add_label(Identifier::unchecked("bar"))
            .add_attribute(("baz", "qux"))
            .build(),
        Block::builder("foo")
            .add_label("bar")
            .add_label(Identifier::unchecked("bar"))
            .add_attribute(("baz", "qux"))
            .build()
            .into(),
    );
}