The function parameter model has been modified to support the passing of named parameters
This commit is contained in:
+27
-26
@@ -15,43 +15,44 @@ const (
|
||||
iterVarStatus = "status"
|
||||
)
|
||||
|
||||
func parseRunArgs(localCtx ExprContext, args []any) (it Iterator, op Functor, err error) {
|
||||
func parseRunArgs(localCtx ExprContext, args map[string]any) (it Iterator, op Functor, err error) {
|
||||
var ok bool
|
||||
|
||||
if it, ok = args[0].(Iterator); !ok {
|
||||
err = fmt.Errorf("paramter %q must be an iterator, passed %v [%s]", ParamIterator, args[0], TypeName(args[0]))
|
||||
if it, ok = args[ParamIterator].(Iterator); !ok {
|
||||
err = fmt.Errorf("paramter %q must be an iterator, passed %v [%s]", ParamIterator, args[ParamIterator], TypeName(args[ParamIterator]))
|
||||
return
|
||||
}
|
||||
|
||||
if len(args) > 1 {
|
||||
if op, ok = args[1].(Functor); !ok || op == nil {
|
||||
err = fmt.Errorf("paramter %q must be a function, passed %v [%s]", iterParamOperator, args[1], TypeName(args[1]))
|
||||
return
|
||||
}
|
||||
if len(args) > 2 {
|
||||
var vars *DictType
|
||||
if vars, ok = args[2].(*DictType); !ok || vars == nil {
|
||||
err = fmt.Errorf("paramter %q must be a dictionary, passed %v [%s]", iterParamVars, args[2], TypeName(args[2]))
|
||||
return
|
||||
}
|
||||
for key, value := range *vars {
|
||||
var varName string
|
||||
if varName, ok = key.(string); ok {
|
||||
localCtx.UnsafeSetVar(varName, value)
|
||||
}
|
||||
if op, ok = args[iterParamOperator].(Functor); !ok && args[iterParamOperator] != nil {
|
||||
err = fmt.Errorf("paramter %q must be a function, passed %v [%s]", iterParamOperator, args[iterParamOperator], TypeName(args[iterParamOperator]))
|
||||
return
|
||||
}
|
||||
|
||||
var vars *DictType
|
||||
if vars, ok = args[iterParamVars].(*DictType); !ok && args[iterParamVars] != nil {
|
||||
err = fmt.Errorf("paramter %q must be a dictionary, passed %v [%s]", iterParamVars, args[iterParamVars], TypeName(args[iterParamVars]))
|
||||
return
|
||||
}
|
||||
|
||||
if vars != nil {
|
||||
for key, value := range *vars {
|
||||
var varName string
|
||||
if varName, ok = key.(string); ok {
|
||||
localCtx.UnsafeSetVar(varName, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func runFunc(ctx ExprContext, name string, args []any) (result any, err error) {
|
||||
func runFunc(ctx ExprContext, name string, args map[string]any) (result any, err error) {
|
||||
var it Iterator
|
||||
var ok bool
|
||||
var op Functor
|
||||
var v any
|
||||
var usingDefaultOp = false
|
||||
var params []any
|
||||
var params map[string]any
|
||||
var item any
|
||||
|
||||
localCtx := ctx.Clone()
|
||||
@@ -60,18 +61,18 @@ func runFunc(ctx ExprContext, name string, args []any) (result any, err error) {
|
||||
if it, op, err = parseRunArgs(localCtx, args); err != nil {
|
||||
return
|
||||
} else if op == nil {
|
||||
op = NewGolangFunctor(printLnFunc)
|
||||
op = NewGolangFunctor2(printLnFunc)
|
||||
usingDefaultOp = true
|
||||
}
|
||||
|
||||
for item, err = it.Next(); err == nil; item, err = it.Next() {
|
||||
if usingDefaultOp {
|
||||
params = []any{item}
|
||||
params = map[string]any{ParamItem: []any{item}}
|
||||
} else {
|
||||
params = []any{it.Index(), item}
|
||||
params = map[string]any{ParamIndex: it.Index(), ParamItem: item}
|
||||
}
|
||||
|
||||
if v, err = op.Invoke(localCtx, iterParamOperator, params); err != nil {
|
||||
if v, err = op.InvokeNamed(localCtx, iterParamOperator, params); err != nil {
|
||||
break
|
||||
} else {
|
||||
var success bool
|
||||
@@ -91,7 +92,7 @@ func runFunc(ctx ExprContext, name string, args []any) (result any, err error) {
|
||||
}
|
||||
|
||||
func ImportIterFuncs(ctx ExprContext) {
|
||||
ctx.RegisterFunc("run", NewGolangFunctor(runFunc), TypeAny, []ExprFuncParam{
|
||||
ctx.RegisterFunc("run", NewGolangFunctor2(runFunc), TypeAny, []ExprFuncParam{
|
||||
NewFuncParam(ParamIterator),
|
||||
NewFuncParamFlag(iterParamOperator, PfOptional),
|
||||
NewFuncParamFlag(iterParamVars, PfOptional),
|
||||
|
||||
Reference in New Issue
Block a user