in wstl1/mapping_engine/util/jsonutil/jsonutil.go [479:531]
func Merge(src JSONToken, dest *JSONToken, failOnOverwrite, overwriteArrays bool) error {
if dest == nil {
return errors.New("destination is nil pointer")
} else if *dest == nil {
*dest = src
return nil
}
// Overwrite or fail.
if isPrim(src) {
if err := getOverwriteError(dest); failOnOverwrite && err != nil {
return err
}
*dest = src
return nil
}
switch d := (*dest).(type) {
case JSONContainer:
if srcCon, ok := src.(JSONContainer); ok {
for k, v := range srcCon {
if d[k] == nil {
d[k] = v
} else if err := Merge(*v, d[k], failOnOverwrite, overwriteArrays); err != nil {
return err
}
}
} else if len(d) == 0 {
// If the destination is empty, allow type change.
*dest = src
} else {
return fmt.Errorf("can't merge source %T with destination %T", src, d)
}
case JSONArr:
if srcArr, ok := src.(JSONArr); ok {
if !overwriteArrays {
*dest = append(d, srcArr...)
} else {
*dest = srcArr
}
} else if len(d) == 0 {
// If the destination is empty, allow type change.
*dest = src
} else {
// TODO(): Append src as is to dest?
return fmt.Errorf("can't merge source %T with destination %T", src, d)
}
default:
return fmt.Errorf("this is an internal bug: destination is of unknown type %T", d)
}
return nil
}