diff --git a/builtin-base.go b/builtin-base.go index c52d657..3077e0f 100644 --- a/builtin-base.go +++ b/builtin-base.go @@ -236,6 +236,35 @@ func varFunc(ctx ExprContext, name string, args map[string]any) (result any, err return } +func setFunc(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 { + ctx.GetParent().UnsafeSetVar(varName, result) + } else { + err = ErrWrongParamType(name, ParamValue, TypeAny, args[ParamValue]) + } + return +} + +func unsetFunc(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]) + } else { + ctx.GetParent().DeleteVar(varName) + result = nil + } + return +} + //// import func ImportBuiltinsFuncs(ctx ExprContext) { @@ -270,6 +299,16 @@ func ImportBuiltinsFuncs(ctx ExprContext) { NewFuncParam(ParamName), NewFuncParamFlagDef(ParamValue, PfDefault, nil), }) + + ctx.RegisterFunc("set", NewGolangFunctor(setFunc), TypeAny, []ExprFuncParam{ + NewFuncParam(ParamName), + NewFuncParam(ParamValue), + }) + + ctx.RegisterFunc("unset", NewGolangFunctor(unsetFunc), TypeAny, []ExprFuncParam{ + NewFuncParam(ParamName), + NewFuncParam(ParamValue), + }) } func init() {