feat(encoding): Add toml codec
Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com>
Mark Sagi-Kazar authored 3 years ago
Márk Sági-Kazár committed 2 years ago
0 | package toml | |
1 | ||
2 | import ( | |
3 | "github.com/pelletier/go-toml" | |
4 | ) | |
5 | ||
6 | // Codec implements the encoding.Encoder and encoding.Decoder interfaces for TOML encoding. | |
7 | type Codec struct{} | |
8 | ||
9 | func (Codec) Encode(v interface{}) ([]byte, error) { | |
10 | if m, ok := v.(map[string]interface{}); ok { | |
11 | t, err := toml.TreeFromMap(m) | |
12 | if err != nil { | |
13 | return nil, err | |
14 | } | |
15 | ||
16 | s, err := t.ToTomlString() | |
17 | if err != nil { | |
18 | return nil, err | |
19 | } | |
20 | ||
21 | return []byte(s), nil | |
22 | } | |
23 | ||
24 | return toml.Marshal(v) | |
25 | } | |
26 | ||
27 | func (Codec) Decode(b []byte, v interface{}) error { | |
28 | tree, err := toml.LoadBytes(b) | |
29 | if err != nil { | |
30 | return err | |
31 | } | |
32 | ||
33 | if m, ok := v.(*map[string]interface{}); ok { | |
34 | vmap := *m | |
35 | tmap := tree.ToMap() | |
36 | for k, v := range tmap { | |
37 | vmap[k] = v | |
38 | } | |
39 | ||
40 | return nil | |
41 | } | |
42 | ||
43 | return tree.Unmarshal(v) | |
44 | } |