File tree 3 files changed +63
-0
lines changed
3 files changed +63
-0
lines changed Original file line number Diff line number Diff line change @@ -374,6 +374,10 @@ func get(params ...any) (out any, err error) {
374
374
i := params [1 ]
375
375
v := reflect .ValueOf (from )
376
376
377
+ if from == nil {
378
+ return nil , nil
379
+ }
380
+
377
381
if v .Kind () == reflect .Invalid {
378
382
panic (fmt .Sprintf ("cannot fetch %v from %T" , i , from ))
379
383
}
Original file line number Diff line number Diff line change @@ -2724,3 +2724,24 @@ func TestExpr_wierd_cases(t *testing.T) {
2724
2724
require .Error (t , err )
2725
2725
require .Contains (t , err .Error (), "unknown name A" )
2726
2726
}
2727
+
2728
+ func TestIssue785_get_nil (t * testing.T ) {
2729
+ exprStrs := []string {
2730
+ `get(nil, "a")` ,
2731
+ `get({}, "a")` ,
2732
+ `get(nil, "a")` ,
2733
+ `get({}, "a")` ,
2734
+ `({} | get("a") | get("b"))` ,
2735
+ }
2736
+
2737
+ for _ , exprStr := range exprStrs {
2738
+ t .Run ("get returns nil" , func (t * testing.T ) {
2739
+ env := map [string ]interface {}{}
2740
+
2741
+ result , err := expr .Eval (exprStr , env )
2742
+ require .NoError (t , err )
2743
+
2744
+ require .Equal (t , nil , result )
2745
+ })
2746
+ }
2747
+ }
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments