From 699d749768bef94e296a6cc6ae13b640ee6890a6 Mon Sep 17 00:00:00 2001 From: Mark Sagi-Kazar Date: Wed, 23 Sep 2020 16:51:49 +0200 Subject: [PATCH] feat(encoding): Add toml codec Signed-off-by: Mark Sagi-Kazar --- internal/encoding/toml/codec.go | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 internal/encoding/toml/codec.go diff --git a/internal/encoding/toml/codec.go b/internal/encoding/toml/codec.go new file mode 100644 index 0000000..c043802 --- /dev/null +++ b/internal/encoding/toml/codec.go @@ -0,0 +1,45 @@ +package toml + +import ( + "github.com/pelletier/go-toml" +) + +// Codec implements the encoding.Encoder and encoding.Decoder interfaces for TOML encoding. +type Codec struct{} + +func (Codec) Encode(v interface{}) ([]byte, error) { + if m, ok := v.(map[string]interface{}); ok { + t, err := toml.TreeFromMap(m) + if err != nil { + return nil, err + } + + s, err := t.ToTomlString() + if err != nil { + return nil, err + } + + return []byte(s), nil + } + + return toml.Marshal(v) +} + +func (Codec) Decode(b []byte, v interface{}) error { + tree, err := toml.LoadBytes(b) + if err != nil { + return err + } + + if m, ok := v.(*map[string]interface{}); ok { + vmap := *m + tmap := tree.ToMap() + for k, v := range tmap { + vmap[k] = v + } + + return nil + } + + return tree.Unmarshal(v) +}