Codebase list golang-github-spf13-viper / 4b307cc
feat(encoding)!: accept a map in the encoder interface This interface is specific to encoding data from Viper's internal, so it's okay to make it Viper specific. BREAKING CHANGE: the encoder interface now accepts a map instead of an interface Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com> Mark Sagi-Kazar authored 2 years ago Márk Sági-Kazár committed 2 years ago
6 changed file(s) with 21 addition(s) and 25 deletion(s). Raw diff Collapse all Expand all
66 // Encoder encodes the contents of v into a byte representation.
77 // It's primarily used for encoding a map[string]interface{} into a file format.
88 type Encoder interface {
9 Encode(v interface{}) ([]byte, error)
9 Encode(v map[string]interface{}) ([]byte, error)
1010 }
1111
1212 const (
4646 return nil
4747 }
4848
49 func (e *EncoderRegistry) Encode(format string, v interface{}) ([]byte, error) {
49 func (e *EncoderRegistry) Encode(format string, v map[string]interface{}) ([]byte, error) {
5050 e.mu.RLock()
5151 encoder, ok := e.encoders[format]
5252 e.mu.RUnlock()
77 b []byte
88 }
99
10 func (e encoder) Encode(_ interface{}) ([]byte, error) {
10 func (e encoder) Encode(_ map[string]interface{}) ([]byte, error) {
1111 return e.b, nil
1212 }
1313
4040 t.Run("OK", func(t *testing.T) {
4141 registry := NewEncoderRegistry()
4242 encoder := encoder{
43 b: []byte("encoded value"),
43 b: []byte("key: value"),
4444 }
4545
4646 err := registry.RegisterEncoder("myformat", encoder)
4848 t.Fatal(err)
4949 }
5050
51 b, err := registry.Encode("myformat", "some value")
51 b, err := registry.Encode("myformat", map[string]interface{}{"key": "value"})
5252 if err != nil {
5353 t.Fatal(err)
5454 }
5555
56 if string(b) != "encoded value" {
57 t.Fatalf("expected 'encoded value', got: %#v", string(b))
56 if string(b) != "key: value" {
57 t.Fatalf("expected 'key: value', got: %#v", string(b))
5858 }
5959 })
6060
6161 t.Run("EncoderNotFound", func(t *testing.T) {
6262 registry := NewEncoderRegistry()
6363
64 _, err := registry.Encode("myformat", "some value")
64 _, err := registry.Encode("myformat", map[string]interface{}{"key": "value"})
6565 if err != ErrEncoderNotFound {
6666 t.Fatalf("expected ErrEncoderNotFound, got: %v", err)
6767 }
1111 // TODO: add printer config to the codec?
1212 type Codec struct{}
1313
14 func (Codec) Encode(v interface{}) ([]byte, error) {
14 func (Codec) Encode(v map[string]interface{}) ([]byte, error) {
1515 b, err := json.Marshal(v)
1616 if err != nil {
1717 return nil, err
66 // Codec implements the encoding.Encoder and encoding.Decoder interfaces for JSON encoding.
77 type Codec struct{}
88
9 func (Codec) Encode(v interface{}) ([]byte, error) {
9 func (Codec) Encode(v map[string]interface{}) ([]byte, error) {
1010 // TODO: expose prefix and indent in the Codec as setting?
1111 return json.MarshalIndent(v, "", " ")
1212 }
66 // Codec implements the encoding.Encoder and encoding.Decoder interfaces for TOML encoding.
77 type Codec struct{}
88
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
9 func (Codec) Encode(v map[string]interface{}) ([]byte, error) {
10 t, err := toml.TreeFromMap(v)
11 if err != nil {
12 return nil, err
2213 }
2314
24 return toml.Marshal(v)
15 s, err := t.ToTomlString()
16 if err != nil {
17 return nil, err
18 }
19
20 return []byte(s), nil
2521 }
2622
2723 func (Codec) Decode(b []byte, v map[string]interface{}) error {
44 // Codec implements the encoding.Encoder and encoding.Decoder interfaces for YAML encoding.
55 type Codec struct{}
66
7 func (Codec) Encode(v interface{}) ([]byte, error) {
7 func (Codec) Encode(v map[string]interface{}) ([]byte, error) {
88 return yaml.Marshal(v)
99 }
1010