utils/govaluate_functions.go (65 lines of code) (raw):
package utils
import (
"errors"
"fmt"
"math"
"strings"
"github.com/Knetic/govaluate"
)
var (
functions = map[string]govaluate.ExpressionFunction{
"getString": func(args ...interface{}) (interface{}, error) {
if len(args) == 0 {
return "", errors.New("args should not empty")
}
if args[0] != "" {
return args[0], nil
}
if len(args) > 1 {
return args[1], nil
}
return "", nil
},
"trim": func(args ...interface{}) (interface{}, error) {
if len(args) != 2 {
return "", errors.New("args length not equal 2")
}
str := ToString(args[0], "")
cutset := ToString(args[1], "")
fmt.Println(strings.TrimPrefix(str, cutset), str, cutset)
return strings.Trim(str, cutset), nil
},
"trimPrefix": func(args ...interface{}) (interface{}, error) {
if len(args) != 2 {
return "", errors.New("args length not equal 2")
}
str := ToString(args[0], "")
cutset := ToString(args[1], "")
return strings.TrimPrefix(str, cutset), nil
},
"replace": func(args ...interface{}) (interface{}, error) {
if len(args) != 3 {
return "", errors.New("args length not equal 3")
}
str := ToString(args[0], "")
old := ToString(args[1], "")
new := ToString(args[2], "")
return strings.ReplaceAll(str, old, new), nil
},
"round": func(args ...interface{}) (interface{}, error) {
if len(args) == 1 {
return math.Round(ToFloat(args[0], 0)), nil
} else if len(args) == 2 {
f := ToFloat(args[0], 0)
n := ToFloat(args[1], 0)
multiplier := math.Pow(10, n)
return math.Trunc(f*multiplier) / multiplier, nil
} else {
return nil, errors.New("wrong number of arguments")
}
},
}
)
func GovaluateFunctions() map[string]govaluate.ExpressionFunction {
return functions
}