expr/helpers.go

58 lines
1.3 KiB
Go

// helpers.go
package expr
import (
"fmt"
"strings"
)
func EvalString(ctx exprContext, source string) (result any, err error) {
var tree *ast
r := strings.NewReader(source)
scanner := NewScanner(r, DefaultTranslations())
parser := NewParser(ctx)
if tree, err = parser.parse(scanner); err == nil {
result, err = tree.Eval(ctx)
}
return
}
type EvalArg struct {
name string
value any
}
func EvalStringA(source string, args ...EvalArg) (result any, err error) {
return EvalStringV(source, args)
}
func EvalStringV(source string, args []EvalArg) (result any, err error) {
ctx := NewSimpleFuncStore()
for _, arg := range args {
if isFunc(arg.value) {
if f, ok := arg.value.(FuncTemplate); ok {
ctx.RegisterFunc(arg.name, f, 0, -1)
} else {
err = fmt.Errorf("invalid function specification: %q", arg.name)
}
} else if integer, ok := anyInteger(arg.value); ok {
ctx.SetValue(arg.name, integer)
} else if float, ok := anyFloat(arg.value); ok {
ctx.SetValue(arg.name, float)
} else if _, ok := arg.value.(string); ok {
ctx.SetValue(arg.name, arg.value)
} else if _, ok := arg.value.(bool); ok {
ctx.SetValue(arg.name, arg.value)
} else {
err = fmt.Errorf("unsupported type %T specified for item %q", arg.value, arg.name)
}
}
if err == nil {
result, err = EvalString(ctx, source)
}
return
}