func setArrField()

in wstl1/mapping_engine/util/jsonutil/jsonutil.go [429:475]


func setArrField(acc JSONTokenAccessor, src JSONToken, segments []string, dest *JSONToken, overwrite bool, matchNesting bool) error {
	o := (*dest).(JSONArr)
	seg := segments[0]
	if seg == "[]" {
		// If both of src and dest are arrays, src will be appended into dest.
		if a, isArr := src.(JSONArr); isArr {
			if len(segments) == 1 {
				*dest = append(o, a...)
				return nil
			} else if matchNesting {
				for _, element := range a {
					n := JSONToken(nil)
					item := &n
					if err := acc.setFieldSegmented(element, segments[1:], item, overwrite, matchNesting); err != nil {
						return err
					}
					*dest = append((*dest).(JSONArr), n)
				}
				return nil
			}
		}
		seg = fmt.Sprintf("[%d]", len(o))
	}
	if !IsIndex(seg) {
		return fmt.Errorf("expected an array index with brackets like [123] but got %s", seg)
	}

	idxSubstr := seg[1 : len(seg)-1]

	if idxSubstr == "*" {
		return fmt.Errorf("cannot use [*] when writing to a field (can only use it when reading)")
	}

	idx, err := strconv.Atoi(idxSubstr)
	if err != nil {
		return fmt.Errorf("could not parse array index %s: %v", seg, err)
	}

	if idx < 0 {
		return fmt.Errorf("negative array indices are not supported but got %d", idx)
	}
	if idx >= len(o) {
		o = append(o, make(JSONArr, idx-len(o)+1)...)
		*dest = o
	}
	return acc.setFieldSegmented(src, segments[1:], &o[idx], overwrite, matchNesting)
}