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)
}