mirror of https://github.com/docker/cli.git
53 lines
1.4 KiB
Go
53 lines
1.4 KiB
Go
|
package mergemaps
|
||
|
|
||
|
import "encoding/json"
|
||
|
|
||
|
// Merge recursively merges map `fromMap` into map `ToMap`. Any pre-existing values
|
||
|
// in ToMap are overwritten. Values in fromMap are added to ToMap.
|
||
|
// From http://stackoverflow.com/questions/40491438/merging-two-json-strings-in-golang
|
||
|
func Merge(fromMap, ToMap interface{}) interface{} {
|
||
|
switch fromMap := fromMap.(type) {
|
||
|
case map[string]interface{}:
|
||
|
ToMap, ok := ToMap.(map[string]interface{})
|
||
|
if !ok {
|
||
|
return fromMap
|
||
|
}
|
||
|
for keyToMap, valueToMap := range ToMap {
|
||
|
if valueFromMap, ok := fromMap[keyToMap]; ok {
|
||
|
fromMap[keyToMap] = Merge(valueFromMap, valueToMap)
|
||
|
} else {
|
||
|
fromMap[keyToMap] = valueToMap
|
||
|
}
|
||
|
}
|
||
|
case nil:
|
||
|
// merge(nil, map[string]interface{...}) -> map[string]interface{...}
|
||
|
ToMap, ok := ToMap.(map[string]interface{})
|
||
|
if ok {
|
||
|
return ToMap
|
||
|
}
|
||
|
}
|
||
|
return fromMap
|
||
|
}
|
||
|
|
||
|
// MergeJSON merges the contents of a JSON string into an object representation,
|
||
|
// returning a new object suitable for translating to JSON.
|
||
|
func MergeJSON(object interface{}, additionalJSON []byte) (interface{}, error) {
|
||
|
if len(additionalJSON) == 0 {
|
||
|
return object, nil
|
||
|
}
|
||
|
objectJSON, err := json.Marshal(object)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
var objectMap, newMap map[string]interface{}
|
||
|
err = json.Unmarshal(objectJSON, &objectMap)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
err = json.Unmarshal(additionalJSON, &newMap)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return Merge(newMap, objectMap), nil
|
||
|
}
|