github.com/annwntech/go-micro/v2@v2.9.5/config/reader/json/json.go (about) 1 package json 2 3 import ( 4 "errors" 5 "time" 6 7 "github.com/imdario/mergo" 8 "github.com/annwntech/go-micro/v2/config/encoder" 9 "github.com/annwntech/go-micro/v2/config/encoder/json" 10 "github.com/annwntech/go-micro/v2/config/reader" 11 "github.com/annwntech/go-micro/v2/config/source" 12 ) 13 14 type jsonReader struct { 15 opts reader.Options 16 json encoder.Encoder 17 } 18 19 func (j *jsonReader) Merge(changes ...*source.ChangeSet) (*source.ChangeSet, error) { 20 var merged map[string]interface{} 21 22 for _, m := range changes { 23 if m == nil { 24 continue 25 } 26 27 if len(m.Data) == 0 { 28 continue 29 } 30 31 codec, ok := j.opts.Encoding[m.Format] 32 if !ok { 33 // fallback 34 codec = j.json 35 } 36 37 var data map[string]interface{} 38 if err := codec.Decode(m.Data, &data); err != nil { 39 return nil, err 40 } 41 if err := mergo.Map(&merged, data, mergo.WithOverride); err != nil { 42 return nil, err 43 } 44 } 45 46 b, err := j.json.Encode(merged) 47 if err != nil { 48 return nil, err 49 } 50 51 cs := &source.ChangeSet{ 52 Timestamp: time.Now(), 53 Data: b, 54 Source: "json", 55 Format: j.json.String(), 56 } 57 cs.Checksum = cs.Sum() 58 59 return cs, nil 60 } 61 62 func (j *jsonReader) Values(ch *source.ChangeSet) (reader.Values, error) { 63 if ch == nil { 64 return nil, errors.New("changeset is nil") 65 } 66 if ch.Format != "json" { 67 return nil, errors.New("unsupported format") 68 } 69 return newValues(ch) 70 } 71 72 func (j *jsonReader) String() string { 73 return "json" 74 } 75 76 // NewReader creates a json reader 77 func NewReader(opts ...reader.Option) reader.Reader { 78 options := reader.NewOptions(opts...) 79 return &jsonReader{ 80 json: json.NewEncoder(), 81 opts: options, 82 } 83 }