func-math.go: improved error messages reporting wrong datatype of items

This commit is contained in:
Celestino Amoroso 2024-05-06 04:18:04 +02:00
parent f55a48aa26
commit 9c66056c18

View File

@ -9,23 +9,29 @@ import (
"io" "io"
) )
func checkNumberParamExpected(funcName string, paramValue any, paramPos int) (err error) { func checkNumberParamExpected(funcName string, paramValue any, paramPos, level, subPos int) (err error) {
if !(isNumber(paramValue) || isList(paramValue) || isFraction(paramValue)) { if !(isNumber(paramValue) || isFraction(paramValue)) /*|| isList(paramValue)*/ {
err = fmt.Errorf("%s(): param nr %d has wrong type %T, number expected", funcName, paramPos+1, paramValue) err = fmt.Errorf("%s(): param nr %d (%d in %d) has wrong type %T, number expected",
funcName, paramPos+1, subPos+1, level, paramValue)
} }
return return
} }
func doAdd(ctx ExprContext, name string, it Iterator) (result any, err error) { func doAdd(ctx ExprContext, name string, it Iterator, count, level int) (result any, err error) {
var sumAsFloat, sumAsFract bool var sumAsFloat, sumAsFract bool
var floatSum float64 = 0.0 var floatSum float64 = 0.0
var intSum int64 = 0 var intSum int64 = 0
var fractSum *fraction var fractSum *fraction
var v any var v any
level++
for v, err = it.Next(); err == nil; v, err = it.Next() { for v, err = it.Next(); err == nil; v, err = it.Next() {
if list, ok := v.(*ListType); ok {
v = NewListIterator(list, nil)
}
if subIter, ok := v.(Iterator); ok { if subIter, ok := v.(Iterator); ok {
if v, err = doAdd(ctx, name, subIter); err != nil { if v, err = doAdd(ctx, name, subIter, count, level); err != nil {
break break
} }
if extIter, ok := v.(ExtIterator); ok && extIter.HasOperation(cleanName) { if extIter, ok := v.(ExtIterator); ok && extIter.HasOperation(cleanName) {
@ -33,16 +39,10 @@ func doAdd(ctx ExprContext, name string, it Iterator) (result any, err error) {
return return
} }
} }
} else { } else if err = checkNumberParamExpected(name, v, count, level, it.Index()); err != nil {
if err = checkNumberParamExpected(name, v, it.Index()); err != nil { break
break
}
if list, ok := v.(*ListType); ok {
if v, err = doAdd(ctx, name, NewListIterator(list, nil)); err != nil {
break
}
}
} }
count++
if !sumAsFloat { if !sumAsFloat {
if isFloat(v) { if isFloat(v) {
@ -87,20 +87,24 @@ func doAdd(ctx ExprContext, name string, it Iterator) (result any, err error) {
} }
func addFunc(ctx ExprContext, name string, args []any) (result any, err error) { func addFunc(ctx ExprContext, name string, args []any) (result any, err error) {
result, err = doAdd(ctx, name, NewArrayIterator(args)) result, err = doAdd(ctx, name, NewArrayIterator(args), 0, -1)
return return
} }
func doMul(ctx ExprContext, name string, it Iterator) (result any, err error) { func doMul(ctx ExprContext, name string, it Iterator, count, level int) (result any, err error) {
var mulAsFloat, mulAsFract bool var mulAsFloat, mulAsFract bool
var floatProd float64 = 1.0 var floatProd float64 = 1.0
var intProd int64 = 1 var intProd int64 = 1
var fractProd *fraction var fractProd *fraction
var v any var v any
level++
for v, err = it.Next(); err == nil; v, err = it.Next() { for v, err = it.Next(); err == nil; v, err = it.Next() {
if list, ok := v.(*ListType); ok {
v = NewListIterator(list, nil)
}
if subIter, ok := v.(Iterator); ok { if subIter, ok := v.(Iterator); ok {
if v, err = doMul(ctx, name, subIter); err != nil { if v, err = doMul(ctx, name, subIter, count, level); err != nil {
break break
} }
if extIter, ok := v.(ExtIterator); ok && extIter.HasOperation(cleanName) { if extIter, ok := v.(ExtIterator); ok && extIter.HasOperation(cleanName) {
@ -109,16 +113,11 @@ func doMul(ctx ExprContext, name string, it Iterator) (result any, err error) {
} }
} }
} else { } else {
if err = checkNumberParamExpected(name, v, it.Index()); err != nil { if err = checkNumberParamExpected(name, v, count, level, it.Index()); err != nil {
break break
} }
if list, ok := v.(*ListType); ok {
if v, err = doMul(ctx, name, NewListIterator(list, nil)); err != nil {
break
}
}
} }
count++
if !mulAsFloat { if !mulAsFloat {
if isFloat(v) { if isFloat(v) {
@ -163,7 +162,7 @@ func doMul(ctx ExprContext, name string, it Iterator) (result any, err error) {
} }
func mulFunc(ctx ExprContext, name string, args []any) (result any, err error) { func mulFunc(ctx ExprContext, name string, args []any) (result any, err error) {
result, err = doMul(ctx, name, NewArrayIterator(args)) result, err = doMul(ctx, name, NewArrayIterator(args), 0, -1)
return return
} }
@ -173,5 +172,5 @@ func ImportMathFuncs(ctx ExprContext) {
} }
func init() { func init() {
registerImport("math.arith", ImportMathFuncs, "Function add() and mul()") registerImport("math.arith", ImportMathFuncs, "Functions add() and mul()")
} }