File tree Expand file tree Collapse file tree 3 files changed +63
-0
lines changed Expand file tree Collapse file tree 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) {
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 }
Original file line number Diff line number Diff line change @@ -2724,3 +2724,24 @@ func TestExpr_wierd_cases(t *testing.T) {
27242724 require .Error (t , err )
27252725 require .Contains (t , err .Error (), "unknown name A" )
27262726}
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