refactored dict's item access
This commit is contained in:
parent
7e357eea62
commit
b1d6b6de44
@ -87,13 +87,14 @@ func evalIndex(ctx ExprContext, self *term) (v any, err error) {
|
|||||||
v = string(unboxedValue[index])
|
v = string(unboxedValue[index])
|
||||||
}
|
}
|
||||||
case *DictType:
|
case *DictType:
|
||||||
var ok bool
|
/* var ok bool
|
||||||
var indexValue any
|
var indexValue any
|
||||||
if indexValue, err = verifyKey(indexTerm, indexList); err == nil {
|
if indexValue, err = verifyKey(indexTerm, indexList); err == nil {
|
||||||
if v, ok = (*unboxedValue)[indexValue]; !ok {
|
if v, ok = (*unboxedValue)[indexValue]; !ok {
|
||||||
err = indexTerm.Errorf("key %v does not belong to the dictionary", rightValue)
|
err = indexTerm.Errorf("key %v does not belong to the dictionary", rightValue)
|
||||||
}
|
}
|
||||||
}
|
} */
|
||||||
|
v, err = getDictItem(unboxedValue, indexTerm, indexList, rightValue)
|
||||||
default:
|
default:
|
||||||
err = self.errIncompatibleTypes(leftValue, rightValue)
|
err = self.errIncompatibleTypes(leftValue, rightValue)
|
||||||
}
|
}
|
||||||
@ -114,15 +115,28 @@ func evalIndex(ctx ExprContext, self *term) (v any, err error) {
|
|||||||
err = self.errIncompatibleTypes(leftValue, rightValue)
|
err = self.errIncompatibleTypes(leftValue, rightValue)
|
||||||
}
|
}
|
||||||
} else if IsDict(leftValue) {
|
} else if IsDict(leftValue) {
|
||||||
var ok bool
|
|
||||||
var indexValue any
|
|
||||||
d := leftValue.(*DictType)
|
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
|
return
|
||||||
}
|
}
|
||||||
|
@ -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},
|
/* 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},
|
/* 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`)},
|
/* 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
|
succeeded := 0
|
||||||
|
Loading…
Reference in New Issue
Block a user