From 71c541c65c7c496e7fcac02fedf8e1dae56d20b4 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Fri, 24 Feb 2017 18:22:36 -0500 Subject: [PATCH] always quote hcl map keys HCL identifiers may need to be quoted, so always quote them to be safe. --- command/hcl_printer.go | 2 +- command/hcl_printer_test.go | 52 +++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 command/hcl_printer_test.go diff --git a/command/hcl_printer.go b/command/hcl_printer.go index 7947bb815..677e5c0aa 100644 --- a/command/hcl_printer.go +++ b/command/hcl_printer.go @@ -94,7 +94,7 @@ func (e *encodeState) encodeMap(m map[string]interface{}) error { for i, k := range sortedKeys(m) { v := m[k] - e.WriteString(k + " = ") + e.WriteString(fmt.Sprintf("%q = ", k)) err := e.encode(v) if err != nil { return err diff --git a/command/hcl_printer_test.go b/command/hcl_printer_test.go new file mode 100644 index 000000000..af0abec6c --- /dev/null +++ b/command/hcl_printer_test.go @@ -0,0 +1,52 @@ +package command + +import "testing" + +// The command package has it's own HCL encoder to encode variables to push. +// Make sure the variable we encode parse correctly +func TestHCLEncoder_parse(t *testing.T) { + cases := []struct { + Name string + Val interface{} + Error bool + }{ + { + Name: "int", + Val: 12345, + }, + { + Name: "float", + Val: 1.2345, + }, + { + Name: "string", + Val: "terraform", + }, + { + Name: "list", + Val: []interface{}{"a", "b", "c"}, + }, + { + Name: "map", + Val: map[string]interface{}{ + "a": 1, + }, + }, + // a numeric looking identifier requires quotes + { + Name: "map_with_quoted_key", + Val: map[string]interface{}{ + "0.0.0.0/24": "mask", + }, + }, + } + + for _, c := range cases { + t.Run(c.Name, func(t *testing.T) { + _, err := encodeHCL(c.Val) + if err != nil { + t.Fatal(err) + } + }) + } +}