// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. // operator-selector.go package expr //-------- export all term func newSelectorTerm(tk *Token) (inst *term) { return &term{ tk: *tk, children: make([]*term, 0, 3), position: posMultifix, priority: priSelector, evalFunc: evalSelector, } } func isSelectorCase(ctx ExprContext, exprValue, caseSel any, caseIndex int) (selectedValue any, err error) { caseData, _ := caseSel.(*selectorCase) if caseData.filterList == nil { selectedValue, err = caseData.caseExpr.eval(ctx, false) } else { filterList := caseData.filterList.children if len(filterList) == 0 && exprValue == int64(caseIndex) { selectedValue, err = caseData.caseExpr.eval(ctx, false) } else { var caseValue any for _, caseTerm := range filterList { if caseValue, err = caseTerm.compute(ctx); err != nil || caseValue == exprValue { selectedValue, err = caseData.caseExpr.eval(ctx, false) break } } } } return } func evalSelector(ctx ExprContext, self *term) (v any, err error) { var exprValue any // var caseList []*term if err = self.checkOperands(); err != nil { return } exprTerm := self.children[0] if exprValue, err = exprTerm.compute(ctx); err != nil { return } caseList := self.children[1:] for i, caseTerm := range caseList { caseSel := caseTerm.value() if v, err = isSelectorCase(ctx, exprValue, caseSel, i); err != nil || v != nil { break } } if err == nil && v == nil { err = exprTerm.tk.Errorf("no case catches the value (%v) of the selection expression", exprValue) } return } // init func init() { registerTermConstructor(SymSelector, newSelectorTerm) }