Skip to content

Commit 5366e57

Browse files
committed
Fix checker: allow to use any as key in maps
1 parent 6382f82 commit 5366e57

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

checker/checker.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) {
393393
return anyType, info{}
394394

395395
case reflect.Map:
396-
if !prop.AssignableTo(base.Key()) {
396+
if !prop.AssignableTo(base.Key()) && !isAny(prop) {
397397
return v.error(node.Property, "cannot use %v to get an element from %v", prop, base)
398398
}
399399
t, c := deref(base.Elem())

expr_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,6 +1599,37 @@ func TestIssue271(t *testing.T) {
15991599
require.Equal(t, 1.0, output)
16001600
}
16011601

1602+
func TestCompile_allow_to_use_interface_to_get_an_element_from_map(t *testing.T) {
1603+
code := `{"value": "ok"}[vars.key]`
1604+
env := map[string]interface{}{
1605+
"vars": map[string]interface{}{
1606+
"key": "value",
1607+
},
1608+
}
1609+
1610+
program, err := expr.Compile(code, expr.Env(env))
1611+
assert.NoError(t, err)
1612+
1613+
out, err := expr.Run(program, env)
1614+
assert.NoError(t, err)
1615+
assert.Equal(t, "ok", out)
1616+
1617+
t.Run("with allow undefined variables", func(t *testing.T) {
1618+
code := `{'key': 'value'}[Key]`
1619+
env := mockMapStringStringEnv{}
1620+
options := []expr.Option{
1621+
expr.AllowUndefinedVariables(),
1622+
}
1623+
1624+
program, err := expr.Compile(code, options...)
1625+
assert.NoError(t, err)
1626+
1627+
out, err := expr.Run(program, env)
1628+
assert.NoError(t, err)
1629+
assert.Equal(t, nil, out)
1630+
})
1631+
}
1632+
16021633
// Mock types
16031634
type mockEnv struct {
16041635
Any interface{}

0 commit comments

Comments
 (0)