diff --git a/operator-index.go b/operator-index.go index 2888d9b..c833a23 100644 --- a/operator-index.go +++ b/operator-index.go @@ -87,13 +87,14 @@ func evalIndex(ctx ExprContext, self *term) (v any, err error) { v = string(unboxedValue[index]) } case *DictType: - var ok bool +/* var ok bool var indexValue any if indexValue, err = verifyKey(indexTerm, indexList); err == nil { if v, ok = (*unboxedValue)[indexValue]; !ok { err = indexTerm.Errorf("key %v does not belong to the dictionary", rightValue) } - } + } */ + v, err = getDictItem(unboxedValue, indexTerm, indexList, rightValue) default: err = self.errIncompatibleTypes(leftValue, rightValue) } @@ -114,15 +115,28 @@ func evalIndex(ctx ExprContext, self *term) (v any, err error) { err = self.errIncompatibleTypes(leftValue, rightValue) } } else if IsDict(leftValue) { - var ok bool - var indexValue any d := leftValue.(*DictType) - if indexValue, err = verifyKey(indexTerm, indexList); err == nil { - if v, ok = (*d)[indexValue]; !ok { - err = indexTerm.Errorf("key %v does not belong to the dictionary", rightValue) - } + + /* var ok bool + var indexValue any + if indexValue, err = verifyKey(indexTerm, indexList); err == nil { + if v, ok = (*d)[indexValue]; !ok { + err = indexTerm.Errorf("key %v does not belong to the dictionary", rightValue) + } + }*/ + v, err = getDictItem(d, indexTerm, indexList, rightValue) + } + return +} + +func getDictItem(d *DictType, indexTerm *term, indexList *ListType, rightValue any) (v any, err error) { + var ok bool + var indexValue any + + if indexValue, err = verifyKey(indexTerm, indexList); err == nil { + if v, ok = (*d)[indexValue]; !ok { + err = indexTerm.Errorf("key %v does not belong to the dictionary", rightValue) } - } return } diff --git a/t_dict_test.go b/t_dict_test.go index e878d44..7ad047b 100644 --- a/t_dict_test.go +++ b/t_dict_test.go @@ -31,6 +31,7 @@ func TestDictParser(t *testing.T) { /* 8 */ {`D={"a":1, "b":2}; D["a"]=9; D`, map[any]any{"a": 9, "b": 2}, nil}, /* 9 */ {`D={"a":1, "b":2}; D["z"]=9; D`, map[any]any{"z": 9, "a": 1, "b": 2}, nil}, /* 10 */ {`D={"a":1, "b":2}; D[nil]=9`, nil, errors.New(`[1:21] index/key is nil`)}, + /* 11 */ {`D={"a":1, "b":2}; D["a"]`, int64(1), nil}, } succeeded := 0