Skip to content

Commit ca0a8da

Browse files
committed
fix(785): get to work when return is nil
1 parent 785630f commit ca0a8da

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

builtin/lib.go

+4
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,10 @@ func get(params ...any) (out any, err error) {
374374
i := params[1]
375375
v := reflect.ValueOf(from)
376376

377+
if from == nil {
378+
return nil, nil
379+
}
380+
377381
if v.Kind() == reflect.Invalid {
378382
panic(fmt.Sprintf("cannot fetch %v from %T", i, from))
379383
}

test/fuzz/fuzz_corpus.txt

+5
Original file line numberDiff line numberDiff line change
@@ -7221,6 +7221,11 @@ get(true ? i64 : greet, i32)
72217221
get(true ? score : true, half)?.half
72227222
get(true ? true : i, f64)
72237223
get({"foo": foo, "bar": false}, type(i))
7224+
get(nil, "a")
7225+
get({}, "a")
7226+
get(nil, "a") == nil
7227+
get({}, "a") == nil
7228+
({} | get("a") | get("b")) == nil
72247229
greet
72257230
greet != greet
72267231
greet != greet != ok

test/issues/785/issue_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package issue_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/expr-lang/expr"
7+
"github.com/expr-lang/expr/internal/testify/require"
8+
)
9+
10+
func TestIssue785(t *testing.T) {
11+
emptyMap := map[string]any{}
12+
13+
env := map[string]interface{}{
14+
"empty_map": emptyMap,
15+
}
16+
17+
{
18+
code := `get(empty_map, "non_existing_key") | get("some_key") | get("another_key") | get("yet_another_key") | get("last_key")`
19+
20+
program, err := expr.Compile(code, expr.Env(env))
21+
require.NoError(t, err)
22+
23+
output, err := expr.Run(program, env)
24+
require.NoError(t, err)
25+
require.Equal(t, nil, output)
26+
}
27+
28+
{
29+
code := `{} | get("non_existing_key") | get("some_key") | get("another_key") | get("yet_another_key") | get("last_key")`
30+
31+
program, err := expr.Compile(code, expr.Env(env))
32+
require.NoError(t, err)
33+
34+
output, err := expr.Run(program, env)
35+
require.NoError(t, err)
36+
require.Equal(t, nil, output)
37+
}
38+
}

0 commit comments

Comments
 (0)