mirror of
https://github.com/hanzoai/expr.git
synced 2026-09-24 16:58:58 +00:00
Fix checker: allow to use any as key in maps
This commit is contained in:
+1
-1
@@ -393,7 +393,7 @@ func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) {
|
||||
return anyType, info{}
|
||||
|
||||
case reflect.Map:
|
||||
if !prop.AssignableTo(base.Key()) {
|
||||
if !prop.AssignableTo(base.Key()) && !isAny(prop) {
|
||||
return v.error(node.Property, "cannot use %v to get an element from %v", prop, base)
|
||||
}
|
||||
t, c := deref(base.Elem())
|
||||
|
||||
@@ -1599,6 +1599,37 @@ func TestIssue271(t *testing.T) {
|
||||
require.Equal(t, 1.0, output)
|
||||
}
|
||||
|
||||
func TestCompile_allow_to_use_interface_to_get_an_element_from_map(t *testing.T) {
|
||||
code := `{"value": "ok"}[vars.key]`
|
||||
env := map[string]interface{}{
|
||||
"vars": map[string]interface{}{
|
||||
"key": "value",
|
||||
},
|
||||
}
|
||||
|
||||
program, err := expr.Compile(code, expr.Env(env))
|
||||
assert.NoError(t, err)
|
||||
|
||||
out, err := expr.Run(program, env)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "ok", out)
|
||||
|
||||
t.Run("with allow undefined variables", func(t *testing.T) {
|
||||
code := `{'key': 'value'}[Key]`
|
||||
env := mockMapStringStringEnv{}
|
||||
options := []expr.Option{
|
||||
expr.AllowUndefinedVariables(),
|
||||
}
|
||||
|
||||
program, err := expr.Compile(code, options...)
|
||||
assert.NoError(t, err)
|
||||
|
||||
out, err := expr.Run(program, env)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, nil, out)
|
||||
})
|
||||
}
|
||||
|
||||
// Mock types
|
||||
type mockEnv struct {
|
||||
Any interface{}
|
||||
|
||||
Reference in New Issue
Block a user