mod common; use common::assert_serialize; use hcl::expr::{Expression, Traversal, Variable}; use hcl::structure::Attribute; use indoc::indoc; #[test] fn custom_struct() { #[derive(serde::Serialize)] struct Test { foo: u32, bar: bool, } assert_serialize( Test { foo: 1, bar: true }, indoc! {r#" foo = 1 bar = true "#}, ); } #[test] fn custom_tuple_struct() { #[derive(serde::Serialize)] struct Test1 { foo: u32, } #[derive(serde::Serialize)] struct Test2 { bar: &'static str, } #[derive(serde::Serialize)] struct TupleStruct(Test1, Test2); assert_serialize( TupleStruct(Test1 { foo: 1 }, Test2 { bar: "baz" }), indoc! {r#" foo = 1 bar = "baz" "#}, ); } #[test] fn custom_enum() { #[derive(serde::Serialize, PartialEq, Debug)] enum E { Unit, Newtype(u32), Tuple(u32, u32), Struct { a: u32 }, } #[derive(serde::Serialize, PartialEq, Debug)] struct Test { value: E, } assert_serialize(Test { value: E::Unit }, "value = \"Unit\"\n"); assert_serialize(E::Newtype(1), "Newtype = 1\n"); assert_serialize( E::Tuple(1, 2), indoc! {r#" Tuple = [ 1, 2 ] "#}, ); assert_serialize( Test { value: E::Struct { a: 1 }, }, indoc! {r#" value = { "Struct" = { "a" = 1 } } "#}, ); } #[test] fn body() { let enabled_var = Traversal::builder(Variable::unchecked("var")) .attr("enabled") .build(); let name_var = Traversal::builder(Variable::unchecked("var")) .attr("name") .build(); let value = hcl::body!({ foo = 1 bar = "baz" qux { foo = "bar" with_labels label1 "lab\"el2" { baz = [ 1, 2, 3 ] } an_object = { foo = "bar" "enabled" = (enabled_var) (name_var) = "the value" } } }); let expected = indoc! {r#" foo = 1 bar = "baz" qux { foo = "bar" with_labels label1 "lab\"el2" { baz = [ 1, 2, 3 ] } an_object = { foo = "bar" "enabled" = var.enabled var.name = "the value" } } "#}; assert_serialize(value, expected); } #[test] fn object() { let value = hcl::value!({ foo = [1, 2, 3] bar = "baz" qux = { "foo" = "bar", "baz" = "qux" } }); let expected = indoc! {r#" foo = [ 1, 2, 3 ] bar = "baz" qux = { "foo" = "bar" "baz" = "qux" } "#}; assert_serialize(value, expected); } #[test] fn array() { let value = hcl::value!([ { foo = [1, 2, 3] }, { bar = "baz" }, { qux = { "foo" = "bar", "baz" = "qux" } } ]); let expected = indoc! {r#" foo = [ 1, 2, 3 ] bar = "baz" qux = { "foo" = "bar" "baz" = "qux" } "#}; assert_serialize(value, expected); } #[test] fn invalid_top_level_types() { assert!(hcl::to_string(&true).is_err()); assert!(hcl::to_string("foo").is_err()); assert!(hcl::to_string(&hcl::value!({ "\"" = "invalid attribute name" })).is_err()) } #[test] fn identifiers_with_hyphens() { assert_serialize( Attribute::new("hyphen-ated", Expression::Null), "hyphen-ated = null\n", ); }