diff --git a/builtin-base.go b/builtin-base.go index b57a4b9..91e5631 100644 --- a/builtin-base.go +++ b/builtin-base.go @@ -5,6 +5,7 @@ package expr import ( + "fmt" "math" "strconv" ) @@ -120,6 +121,32 @@ func decFunc(ctx ExprContext, name string, args []any) (result any, err error) { return } +func stringFunc(ctx ExprContext, name string, args []any) (result any, err error) { + switch v := args[0].(type) { + case int64: + result = strconv.FormatInt(v, 10) + case float64: + result = strconv.FormatFloat(v, 'g', -1, 64) + case bool: + if v { + result = "true" + } else { + result = "false" + } + case string: + result = v + case *FractionType: + result = v.ToString(0) + case Formatter: + result = v.ToString(0) + case fmt.Stringer: + result = v.String() + default: + err = ErrCantConvert(name, v, "string") + } + return +} + func fractFunc(ctx ExprContext, name string, args []any) (result any, err error) { switch v := args[0].(type) { case int64: @@ -175,6 +202,7 @@ func ImportBuiltinsFuncs(ctx ExprContext) { ctx.RegisterFunc("bool", NewGolangFunctor(boolFunc), TypeBoolean, anyParams) ctx.RegisterFunc("int", NewGolangFunctor(intFunc), TypeInt, anyParams) ctx.RegisterFunc("dec", NewGolangFunctor(decFunc), TypeFloat, anyParams) + ctx.RegisterFunc("string", NewGolangFunctor(stringFunc), TypeString, anyParams) ctx.RegisterFunc("fract", NewGolangFunctor(fractFunc), TypeFraction, []ExprFuncParam{ NewFuncParam(ParamValue), NewFuncParamFlagDef("denominator", PfDefault, 1),