mirror of
https://github.com/hanzoai/expr.git
synced 2026-09-24 16:58:58 +00:00
fix(785): get to work when return is nil (#786)
* fix(785): `get` to work when return is `nil` * improve testing
This commit is contained in:
@@ -374,6 +374,10 @@ func get(params ...any) (out any, err error) {
|
||||
i := params[1]
|
||||
v := reflect.ValueOf(from)
|
||||
|
||||
if from == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
if v.Kind() == reflect.Invalid {
|
||||
panic(fmt.Sprintf("cannot fetch %v from %T", i, from))
|
||||
}
|
||||
|
||||
@@ -2724,3 +2724,24 @@ func TestExpr_wierd_cases(t *testing.T) {
|
||||
require.Error(t, err)
|
||||
require.Contains(t, err.Error(), "unknown name A")
|
||||
}
|
||||
|
||||
func TestIssue785_get_nil(t *testing.T) {
|
||||
exprStrs := []string{
|
||||
`get(nil, "a")`,
|
||||
`get({}, "a")`,
|
||||
`get(nil, "a")`,
|
||||
`get({}, "a")`,
|
||||
`({} | get("a") | get("b"))`,
|
||||
}
|
||||
|
||||
for _, exprStr := range exprStrs {
|
||||
t.Run("get returns nil", func(t *testing.T) {
|
||||
env := map[string]interface{}{}
|
||||
|
||||
result, err := expr.Eval(exprStr, env)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, nil, result)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package issue_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/expr-lang/expr"
|
||||
"github.com/expr-lang/expr/internal/testify/require"
|
||||
)
|
||||
|
||||
func TestIssue785(t *testing.T) {
|
||||
emptyMap := map[string]any{}
|
||||
|
||||
env := map[string]interface{}{
|
||||
"empty_map": emptyMap,
|
||||
}
|
||||
|
||||
{
|
||||
code := `get(empty_map, "non_existing_key") | get("some_key") | get("another_key") | get("yet_another_key") | get("last_key")`
|
||||
|
||||
program, err := expr.Compile(code, expr.Env(env))
|
||||
require.NoError(t, err)
|
||||
|
||||
output, err := expr.Run(program, env)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, nil, output)
|
||||
}
|
||||
|
||||
{
|
||||
code := `{} | get("non_existing_key") | get("some_key") | get("another_key") | get("yet_another_key") | get("last_key")`
|
||||
|
||||
program, err := expr.Compile(code, expr.Env(env))
|
||||
require.NoError(t, err)
|
||||
|
||||
output, err := expr.Run(program, env)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, nil, output)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user