From 522b5983bd3c7430401097597861ae44d8f0873e Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Wed, 26 Jun 2024 04:27:14 +0200 Subject: [PATCH] builtin-base.go: string() function added --- builtin-base.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) 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),