diff --git a/builtin-base.go b/builtin-base.go index 537be8b..30e57c5 100644 --- a/builtin-base.go +++ b/builtin-base.go @@ -211,6 +211,25 @@ func evalFunc(ctx ExprContext, name string, args map[string]any) (result any, er return } +func varFunc(ctx ExprContext, name string, args map[string]any) (result any, err error) { + var varName string + var ok bool + + if varName, ok = args[ParamName].(string); !ok { + return nil, ErrWrongParamType(name, ParamName, TypeString, args[ParamName]) + } + + if result, ok = args[ParamValue]; ok && result != nil { + ctx.GetParent().UnsafeSetVar(varName, result) + // } else { + // err = ErrWrongParamType(name, ParamSource, TypeString, args[ParamSource]) + // } + } else if result, ok = ctx.GetVar(varName); !ok { + err = ErrUnknownVar(name, varName) + } + return +} + //// import func ImportBuiltinsFuncs(ctx ExprContext) { @@ -240,6 +259,11 @@ func ImportBuiltinsFuncs(ctx ExprContext) { ctx.RegisterFunc("eval", NewGolangFunctor(evalFunc), TypeAny, []ExprFuncParam{ NewFuncParam(ParamSource), }) + + ctx.RegisterFunc("var", NewGolangFunctor(varFunc), TypeAny, []ExprFuncParam{ + NewFuncParam(ParamName), + NewFuncParamFlagDef(ParamValue, PfDefault, nil), + }) } func init() { diff --git a/common-errors.go b/common-errors.go index f103c2c..f0b6973 100644 --- a/common-errors.go +++ b/common-errors.go @@ -80,6 +80,10 @@ func ErrUnknownParam(funcName, paramName string) error { return fmt.Errorf("%s(): unknown parameter %q", funcName, paramName) } +func ErrUnknownVar(funcName, varName string) error { + return fmt.Errorf("%s(): unknown variable %q", funcName, varName) +} + // --- Operator errors func ErrLeftOperandMustBeVariable(leftTerm, opTerm *term) error {