in pkg/ottl/functions.go [541:658]
func (p *Parser[K]) buildArg(argVal value, argType reflect.Type) (any, error) {
name := argType.Name()
switch {
case strings.HasPrefix(name, "Setter"):
fallthrough
case strings.HasPrefix(name, "GetSetter"):
if argVal.Literal != nil && argVal.Literal.Path != nil {
return p.buildGetSetterFromPath(argVal.Literal.Path)
}
return nil, fmt.Errorf("must be a path")
case strings.HasPrefix(name, "Getter"):
arg, err := p.newGetter(argVal)
if err != nil {
return nil, err
}
return arg, nil
case strings.HasPrefix(name, "StringGetter"):
arg, err := p.newGetter(argVal)
if err != nil {
return nil, err
}
return StandardStringGetter[K]{Getter: arg.Get}, nil
case strings.HasPrefix(name, "StringLikeGetter"):
arg, err := p.newGetter(argVal)
if err != nil {
return nil, err
}
return StandardStringLikeGetter[K]{Getter: arg.Get}, nil
case strings.HasPrefix(name, "FloatGetter"):
arg, err := p.newGetter(argVal)
if err != nil {
return nil, err
}
return StandardFloatGetter[K]{Getter: arg.Get}, nil
case strings.HasPrefix(name, "FloatLikeGetter"):
arg, err := p.newGetter(argVal)
if err != nil {
return nil, err
}
return StandardFloatLikeGetter[K]{Getter: arg.Get}, nil
case strings.HasPrefix(name, "IntGetter"):
arg, err := p.newGetter(argVal)
if err != nil {
return nil, err
}
return StandardIntGetter[K]{Getter: arg.Get}, nil
case strings.HasPrefix(name, "IntLikeGetter"):
arg, err := p.newGetter(argVal)
if err != nil {
return nil, err
}
return StandardIntLikeGetter[K]{Getter: arg.Get}, nil
case strings.HasPrefix(name, "PMapGetter"):
arg, err := p.newGetter(argVal)
if err != nil {
return nil, err
}
return StandardPMapGetter[K]{Getter: arg.Get}, nil
case strings.HasPrefix(name, "DurationGetter"):
arg, err := p.newGetter(argVal)
if err != nil {
return nil, err
}
return StandardDurationGetter[K]{Getter: arg.Get}, nil
case strings.HasPrefix(name, "TimeGetter"):
arg, err := p.newGetter(argVal)
if err != nil {
return nil, err
}
return StandardTimeGetter[K]{Getter: arg.Get}, nil
case strings.HasPrefix(name, "BoolGetter"):
arg, err := p.newGetter(argVal)
if err != nil {
return nil, err
}
return StandardBoolGetter[K]{Getter: arg.Get}, nil
case strings.HasPrefix(name, "BoolLikeGetter"):
arg, err := p.newGetter(argVal)
if err != nil {
return nil, err
}
return StandardBoolLikeGetter[K]{Getter: arg.Get}, nil
case strings.HasPrefix(name, "ByteSliceLikeGetter"):
arg, err := p.newGetter(argVal)
if err != nil {
return nil, err
}
return StandardByteSliceLikeGetter[K]{Getter: arg.Get}, nil
case name == "Enum":
arg, err := p.enumParser((*EnumSymbol)(argVal.Enum))
if err != nil {
return nil, fmt.Errorf("must be an Enum")
}
return *arg, nil
case name == reflect.String.String():
if argVal.String == nil {
return nil, fmt.Errorf("must be a string")
}
return *argVal.String, nil
case name == reflect.Float64.String():
if argVal.Literal == nil || argVal.Literal.Float == nil {
return nil, fmt.Errorf("must be a float")
}
return *argVal.Literal.Float, nil
case name == reflect.Int64.String():
if argVal.Literal == nil || argVal.Literal.Int == nil {
return nil, fmt.Errorf("must be an int")
}
return *argVal.Literal.Int, nil
case name == reflect.Bool.String():
if argVal.Bool == nil {
return nil, fmt.Errorf("must be a bool")
}
return bool(*argVal.Bool), nil
default:
return nil, fmt.Errorf("unsupported argument type: %s", name)
}
}