From 6f154447710aec8ebbc774483c66f13a8f8ba883 Mon Sep 17 00:00:00 2001 From: Mark Sagi-Kazar Date: Wed, 23 Sep 2020 16:45:59 +0200 Subject: [PATCH] feat(encoding): Add hcl codec Signed-off-by: Mark Sagi-Kazar --- internal/encoding/hcl/codec.go | 40 ++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 internal/encoding/hcl/codec.go diff --git a/internal/encoding/hcl/codec.go b/internal/encoding/hcl/codec.go new file mode 100644 index 0000000..f3e4ab1 --- /dev/null +++ b/internal/encoding/hcl/codec.go @@ -0,0 +1,40 @@ +package hcl + +import ( + "bytes" + "encoding/json" + + "github.com/hashicorp/hcl" + "github.com/hashicorp/hcl/hcl/printer" +) + +// Codec implements the encoding.Encoder and encoding.Decoder interfaces for HCL encoding. +// TODO: add printer config to the codec? +type Codec struct{} + +func (Codec) Encode(v interface{}) ([]byte, error) { + b, err := json.Marshal(v) + if err != nil { + return nil, err + } + + // TODO: use printer.Format? Is the trailing newline an issue? + + ast, err := hcl.Parse(string(b)) + if err != nil { + return nil, err + } + + var buf bytes.Buffer + + err = printer.Fprint(&buf, ast.Node) + if err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +func (Codec) Decode(b []byte, v interface{}) error { + return hcl.Unmarshal(b, v) +}