-
-
Notifications
You must be signed in to change notification settings - Fork 457
Description
Hey @antonmedv, great library, and appreciate your contribution to the Open Source world!
I've been trying to port my own tabloid
app to an expression library like yours (I tried cel-go
, but it's still too cumbersome to use) since the library I'm using seems abandonware.
I tried to create a function called ready
that would take in a field. If the field says "ready"
, then it would return true, or false otherwise.
When I tried to plug it in and tell the compiler that the returned expression should be a boolean, I got an error because the return value of an expr.Function
is an interface{}
, not a boolean (even if the underlying interface value is a boolean).
Here's an example code. This code works, but it does not provide the help of expr.AsBool()
(as in, it won't pre-check if the expression does return a boolean or not):
_, err := expr.Compile("ready(ready)", expr.Function("ready", func(params ...any) (any, error) {
return params[0].(string) == "ready", nil
}))
if err != nil {
log.Fatal(err.Error())
}
This code, on the other hand, does not work (note the expr.AsBool()
call). It fails with expected bool, but got interface {}
:
_, err = expr.Compile("ready(ready)", expr.AsBool(), expr.Function("ready", func(params ...any) (any, error) {
return params[0].(string) == "ready", nil
}))
if err != nil {
log.Fatal(err.Error())
}
Runnable Go playground: https://go.dev/play/p/kAqIUjaLJhX
I'm working around it by simply compiling without the AsBool
call, and just checking the returned value once the expression executes, but I feel it could be improved by checking the interface value. I don't know enough about the library though to know whether this would have any side effect.