...

Source file src/github.com/Microsoft/hcsshim/internal/mergemaps/merge.go

Documentation: github.com/Microsoft/hcsshim/internal/mergemaps

     1  package mergemaps
     2  
     3  import "encoding/json"
     4  
     5  // Merge recursively merges map `fromMap` into map `ToMap`. Any pre-existing values
     6  // in ToMap are overwritten. Values in fromMap are added to ToMap.
     7  // From http://stackoverflow.com/questions/40491438/merging-two-json-strings-in-golang
     8  func Merge(fromMap, ToMap interface{}) interface{} {
     9  	switch fromMap := fromMap.(type) {
    10  	case map[string]interface{}:
    11  		ToMap, ok := ToMap.(map[string]interface{})
    12  		if !ok {
    13  			return fromMap
    14  		}
    15  		for keyToMap, valueToMap := range ToMap {
    16  			if valueFromMap, ok := fromMap[keyToMap]; ok {
    17  				fromMap[keyToMap] = Merge(valueFromMap, valueToMap)
    18  			} else {
    19  				fromMap[keyToMap] = valueToMap
    20  			}
    21  		}
    22  	case nil:
    23  		// merge(nil, map[string]interface{...}) -> map[string]interface{...}
    24  		ToMap, ok := ToMap.(map[string]interface{})
    25  		if ok {
    26  			return ToMap
    27  		}
    28  	}
    29  	return fromMap
    30  }
    31  
    32  // MergeJSON merges the contents of a JSON string into an object representation,
    33  // returning a new object suitable for translating to JSON.
    34  func MergeJSON(object interface{}, additionalJSON []byte) (interface{}, error) {
    35  	if len(additionalJSON) == 0 {
    36  		return object, nil
    37  	}
    38  	objectJSON, err := json.Marshal(object)
    39  	if err != nil {
    40  		return nil, err
    41  	}
    42  	var objectMap, newMap map[string]interface{}
    43  	err = json.Unmarshal(objectJSON, &objectMap)
    44  	if err != nil {
    45  		return nil, err
    46  	}
    47  	err = json.Unmarshal(additionalJSON, &newMap)
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  	return Merge(newMap, objectMap), nil
    52  }
    53  

View as plain text