expressions now support dict data-type
This commit is contained in:
+18
-7
@@ -4,6 +4,8 @@
|
||||
// operator-dot.go
|
||||
package expr
|
||||
|
||||
import "fmt"
|
||||
|
||||
// -------- dot term
|
||||
func newDotTerm(tk *Token) (inst *term) {
|
||||
return &term{
|
||||
@@ -23,15 +25,13 @@ func evalDot(ctx ExprContext, self *term) (v any, err error) {
|
||||
}
|
||||
|
||||
indexTerm := self.children[1]
|
||||
if !isInteger(rightValue) {
|
||||
err = indexTerm.Errorf("index expression must be integer, got %T", rightValue)
|
||||
return
|
||||
}
|
||||
|
||||
index64, _ := rightValue.(int64)
|
||||
index := int(index64)
|
||||
|
||||
if isList(leftValue) {
|
||||
var index int
|
||||
if index, err = indexTerm.toInt(rightValue, "index expression value must be integer"); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
list, _ := leftValue.([]any)
|
||||
if index >= 0 && index < len(list) {
|
||||
v = list[index]
|
||||
@@ -41,6 +41,11 @@ func evalDot(ctx ExprContext, self *term) (v any, err error) {
|
||||
err = indexTerm.Errorf("index %v out of bounds", index)
|
||||
}
|
||||
} else if isString(leftValue) {
|
||||
var index int
|
||||
if index, err = indexTerm.toInt(rightValue, "index expression value must be integer"); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
s, _ := leftValue.(string)
|
||||
if index >= 0 && index < len(s) {
|
||||
v = string(s[index])
|
||||
@@ -49,6 +54,12 @@ func evalDot(ctx ExprContext, self *term) (v any, err error) {
|
||||
} else {
|
||||
err = indexTerm.Errorf("index %v out of bounds", index)
|
||||
}
|
||||
} else if isDict(leftValue) {
|
||||
var ok bool
|
||||
d, _ := leftValue.(map[any]any)
|
||||
if v, ok = d[rightValue]; !ok {
|
||||
err = fmt.Errorf("key %v does not belong to the dictionary", rightValue)
|
||||
}
|
||||
} else {
|
||||
err = self.errIncompatibleTypes(leftValue, rightValue)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user