accessing to the Reset() and Clean()functions of an iterator is now done by identifiers, i.e. reset, not by string, i.e. "reset".

This commit is contained in:
Celestino Amoroso 2024-04-28 04:44:19 +02:00
parent 2ccbdb2254
commit 06ab303b9e

View File

@ -17,8 +17,10 @@ func newDotTerm(tk *Token) (inst *term) {
} }
} }
func verifyIndex(indexTerm *term, indexValue any, maxValue int) (index int, err error) { func verifyIndex(ctx ExprContext, indexTerm *term, maxValue int) (index int, err error) {
var v int var v int
var indexValue any
if indexValue, err = indexTerm.compute(ctx); err == nil {
if v, err = indexTerm.toInt(indexValue, "index expression value must be integer"); err == nil { if v, err = indexTerm.toInt(indexValue, "index expression value must be integer"); err == nil {
if v >= 0 && v < maxValue { if v >= 0 && v < maxValue {
index = v index = v
@ -28,13 +30,17 @@ func verifyIndex(indexTerm *term, indexValue any, maxValue int) (index int, err
err = indexTerm.Errorf("index %d out of bounds", v) err = indexTerm.Errorf("index %d out of bounds", v)
} }
} }
}
return return
} }
func evalDot(ctx ExprContext, self *term) (v any, err error) { func evalDot(ctx ExprContext, self *term) (v any, err error) {
var leftValue, rightValue any var leftValue, rightValue any
if leftValue, rightValue, err = self.evalInfix(ctx); err != nil { if err = self.checkOperands(); err != nil {
return
}
if leftValue, err = self.children[0].compute(ctx); err != nil {
return return
} }
@ -43,22 +49,25 @@ func evalDot(ctx ExprContext, self *term) (v any, err error) {
switch unboxedValue := leftValue.(type) { switch unboxedValue := leftValue.(type) {
case []any: case []any:
var index int var index int
if index, err = verifyIndex(indexTerm, rightValue, len(unboxedValue)); err == nil { if index, err = verifyIndex(ctx, indexTerm, len(unboxedValue)); err == nil {
v = unboxedValue[index] v = unboxedValue[index]
} }
case string: case string:
var index int var index int
if index, err = verifyIndex(indexTerm, rightValue, len(unboxedValue)); err == nil { if index, err = verifyIndex(ctx, indexTerm, len(unboxedValue)); err == nil {
v = unboxedValue[index] v = unboxedValue[index]
} }
case map[any]any: case map[any]any:
var ok bool var ok bool
if v, ok = unboxedValue[rightValue]; !ok { var indexValue any
if indexValue, err = indexTerm.compute(ctx); err == nil {
if v, ok = unboxedValue[indexValue]; !ok {
err = fmt.Errorf("key %v does not belong to the dictionary", rightValue) err = fmt.Errorf("key %v does not belong to the dictionary", rightValue)
} }
}
case *dataCursor: case *dataCursor:
if indexTerm.symbol() == SymString { if indexTerm.symbol() == SymIdentifier {
opName := indexTerm.value() opName := indexTerm.source()
if opName == resetName { if opName == resetName {
err = unboxedValue.Reset() err = unboxedValue.Reset()
} else if opName == cleanName { } else if opName == cleanName {