func appendTo[K any]()

in pkg/ottl/ottlfuncs/func_append.go [34:128]


func appendTo[K any](target ottl.GetSetter[K], value ottl.Optional[ottl.Getter[K]], values ottl.Optional[[]ottl.Getter[K]]) (ottl.ExprFunc[K], error) {
	if value.IsEmpty() && values.IsEmpty() {
		return nil, fmt.Errorf("at least one of the optional arguments ('value' or 'values') must be provided")
	}

	return func(ctx context.Context, tCtx K) (any, error) {
		t, err := target.Get(ctx, tCtx)
		if err != nil {
			return nil, err
		}

		// init res with target values
		var res []any

		if t != nil {
			switch targetType := t.(type) {
			case pcommon.Slice:
				res = append(res, targetType.AsRaw()...)
			case pcommon.Value:
				switch targetType.Type() {
				case pcommon.ValueTypeEmpty:
					res = append(res, targetType.Str())
				case pcommon.ValueTypeStr:
					res = append(res, targetType.Str())
				case pcommon.ValueTypeInt:
					res = append(res, targetType.Int())
				case pcommon.ValueTypeDouble:
					res = append(res, targetType.Double())
				case pcommon.ValueTypeBool:
					res = append(res, targetType.Bool())
				case pcommon.ValueTypeSlice:
					res = append(res, targetType.Slice().AsRaw()...)
				default:
					return nil, fmt.Errorf("unsupported type of target field: %q", targetType.Type())
				}

			case []string:
				res = appendMultiple(res, targetType)
			case []any:
				res = append(res, targetType...)
			case []int64:
				res = appendMultiple(res, targetType)
			case []bool:
				res = appendMultiple(res, targetType)
			case []float64:
				res = appendMultiple(res, targetType)

			case string:
				res = append(res, targetType)
			case int64:
				res = append(res, targetType)
			case bool:
				res = append(res, targetType)
			case float64:
				res = append(res, targetType)
			case any:
				res = append(res, targetType)
			default:
				return nil, fmt.Errorf("unsupported type of target field: '%T'", t)
			}
		}

		appendGetterFn := func(g ottl.Getter[K]) error {
			v, err := g.Get(ctx, tCtx)
			if err != nil {
				return err
			}
			res = append(res, v)
			return nil
		}

		if !value.IsEmpty() {
			getter := value.Get()
			if err := appendGetterFn(getter); err != nil {
				return nil, err
			}
		}
		if !values.IsEmpty() {
			getters := values.Get()
			for _, g := range getters {
				if err := appendGetterFn(g); err != nil {
					return nil, err
				}
			}
		}

		// retype []any to Slice, having []any sometimes misbehaves and nils pcommon.Value
		resSlice := pcommon.NewSlice()
		if err := resSlice.FromRaw(res); err != nil {
			return nil, err
		}

		return nil, target.Set(ctx, tCtx, resSlice)
	}, nil
}