codec.go raw

   1  package hcl
   2  
   3  import (
   4  	"bytes"
   5  	"encoding/json"
   6  
   7  	"github.com/hashicorp/hcl"
   8  	"github.com/hashicorp/hcl/hcl/printer"
   9  )
  10  
  11  // Codec implements the encoding.Encoder and encoding.Decoder interfaces for HCL encoding.
  12  // TODO: add printer config to the codec?
  13  type Codec struct{}
  14  
  15  func (Codec) Encode(v map[string]any) ([]byte, error) {
  16  	b, err := json.Marshal(v)
  17  	if err != nil {
  18  		return nil, err
  19  	}
  20  
  21  	// TODO: use printer.Format? Is the trailing newline an issue?
  22  
  23  	ast, err := hcl.Parse(string(b))
  24  	if err != nil {
  25  		return nil, err
  26  	}
  27  
  28  	var buf bytes.Buffer
  29  
  30  	err = printer.Fprint(&buf, ast.Node)
  31  	if err != nil {
  32  		return nil, err
  33  	}
  34  
  35  	return buf.Bytes(), nil
  36  }
  37  
  38  func (Codec) Decode(b []byte, v map[string]any) error {
  39  	return hcl.Unmarshal(b, &v)
  40  }
  41