func Merge()

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
}