expr 是基于 github.com/google/cel-go 再次封装的表达式解析和执行的工具,简化了 cel-go 的用法。
已实现的特性:
- 表达式解析支持 Common Expression Language (CEL)
- 表达式执行入参支持 Go 的基础类型或者 ProtoBuf 声明的类型
- 表达式解析支持自定义函数
待实现的特性:
- 表达式执行出参支持自定义解析器
简单用法举例:
expr, err := NewExpr("this.value > 60", ThisVariable())
if err != nil {
panic(err)
}
result, err := expr.Eval(map[string]any{"this": map[string]any{"value": 50}})
if err != nil {
panic(err)
}
fmt.Println("result:", result)
// result: false
自定义函数用法举例:
expr, err := NewExpr("shake_hands(i,you)",
Variable("i", StringType),
Variable("you", StringType),
Function("shake_hands",
Overload("shake_hands_string_string", []*Type{StringType, StringType}, StringType,
BinaryBinding(func(arg1, arg2 Val) Val {
return String(fmt.Sprintf("%v and %v are shaking hands.\n", arg1, arg2))
}),
),
))
if err != nil {
panic(err)
}
result, err := expr.Eval(map[string]any{
"i": "CEL",
"you": func() Val { return String("world") },
})
if err != nil {
panic(err)
}
fmt.Println("result:", result)
// result: CEL and world are shaking hands.
项目刚拉起,欢迎向 https://github.com/zhijingtech/expr 提交问题或者PR。