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:
2pac
2025-05-12 18:32:48 +02:00
committed by GitHub
parent 5f9f6bb4b6
commit 9e10dcd6b4
3 changed files with 63 additions and 0 deletions
+4
View File
@@ -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))
}
+21
View File
@@ -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)
})
}
}
+38
View File
@@ -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)
}
}