diff --git a/builtin-base.go b/builtin-base.go index 4323204..b57a4b9 100644 --- a/builtin-base.go +++ b/builtin-base.go @@ -67,7 +67,7 @@ func boolFunc(ctx ExprContext, name string, args []any) (result any, err error) case string: result = len(v) > 0 default: - err = errCantConvert(name, v, "bool") + err = ErrCantConvert(name, v, "bool") } return } @@ -90,7 +90,7 @@ func intFunc(ctx ExprContext, name string, args []any) (result any, err error) { result = int64(i) } default: - err = errCantConvert(name, v, "int") + err = ErrCantConvert(name, v, "int") } return } @@ -115,7 +115,7 @@ func decFunc(ctx ExprContext, name string, args []any) (result any, err error) { case *FractionType: result = v.toFloat() default: - err = errCantConvert(name, v, "float") + err = ErrCantConvert(name, v, "float") } return } @@ -127,9 +127,9 @@ func fractFunc(ctx ExprContext, name string, args []any) (result any, err error) if len(args) > 1 { var ok bool if den, ok = args[1].(int64); !ok { - err = errExpectedGot(name, "integer", args[1]) + err = ErrExpectedGot(name, "integer", args[1]) } else if den == 0 { - err = errFuncDivisionByZero(name) + err = ErrFuncDivisionByZero(name) } } if err == nil { @@ -148,7 +148,7 @@ func fractFunc(ctx ExprContext, name string, args []any) (result any, err error) case *FractionType: result = v default: - err = errCantConvert(name, v, "float") + err = ErrCantConvert(name, v, "float") } return } diff --git a/builtin-string.go b/builtin-string.go index 721ad66..23f1be9 100644 --- a/builtin-string.go +++ b/builtin-string.go @@ -21,7 +21,7 @@ func doJoinStr(funcName string, sep string, it Iterator) (result any, err error) if s, ok := v.(string); ok { sb.WriteString(s) } else { - err = errExpectedGot(funcName, TypeString, v) + err = ErrExpectedGot(funcName, TypeString, v) return } } @@ -45,13 +45,13 @@ func joinStrFunc(ctx ExprContext, name string, args []any) (result any, err erro } else if it, ok := args[1].(Iterator); ok { result, err = doJoinStr(name, sep, it) } else { - err = errInvalidParameterValue(name, ParamParts, args[1]) + err = ErrInvalidParameterValue(name, ParamParts, args[1]) } } else { result, err = doJoinStr(name, sep, NewArrayIterator(args[1:])) } } else { - err = errWrongParamType(name, ParamSeparator, TypeString, args[0]) + err = ErrWrongParamType(name, ParamSeparator, TypeString, args[0]) } return } @@ -63,7 +63,7 @@ func subStrFunc(ctx ExprContext, name string, args []any) (result any, err error var ok bool if source, ok = args[0].(string); !ok { - return nil, errWrongParamType(name, ParamSource, TypeString, args[0]) + return nil, ErrWrongParamType(name, ParamSource, TypeString, args[0]) } if start, err = ToInt(args[1], name+"()"); err != nil { @@ -91,7 +91,7 @@ func trimStrFunc(ctx ExprContext, name string, args []any) (result any, err erro var ok bool if source, ok = args[0].(string); !ok { - return nil, errWrongParamType(name, ParamSource, TypeString, args[0]) + return nil, ErrWrongParamType(name, ParamSource, TypeString, args[0]) } result = strings.TrimSpace(source) return @@ -104,7 +104,7 @@ func startsWithStrFunc(ctx ExprContext, name string, args []any) (result any, er result = false if source, ok = args[0].(string); !ok { - return result, errWrongParamType(name, ParamSource, TypeString, args[0]) + return result, ErrWrongParamType(name, ParamSource, TypeString, args[0]) } for i, targetSpec := range args[1:] { if target, ok := targetSpec.(string); ok { @@ -127,7 +127,7 @@ func endsWithStrFunc(ctx ExprContext, name string, args []any) (result any, err result = false if source, ok = args[0].(string); !ok { - return result, errWrongParamType(name, ParamSource, TypeString, args[0]) + return result, ErrWrongParamType(name, ParamSource, TypeString, args[0]) } for i, targetSpec := range args[1:] { if target, ok := targetSpec.(string); ok { @@ -150,7 +150,7 @@ func splitStrFunc(ctx ExprContext, name string, args []any) (result any, err err var ok bool if source, ok = args[0].(string); !ok { - return result, errWrongParamType(name, ParamSource, TypeString, args[0]) + return result, ErrWrongParamType(name, ParamSource, TypeString, args[0]) } if sep, ok = args[1].(string); !ok { @@ -182,34 +182,34 @@ func splitStrFunc(ctx ExprContext, name string, args []any) (result any, err err // Import above functions in the context func ImportStringFuncs(ctx ExprContext) { - ctx.RegisterFunc("joinStr", NewGolangFunctor(joinStrFunc), TypeString, []ExprFuncParam{ + ctx.RegisterFunc("strJoin", NewGolangFunctor(joinStrFunc), TypeString, []ExprFuncParam{ NewFuncParam(ParamSeparator), NewFuncParamFlag(ParamItem, PfRepeat), }) - ctx.RegisterFunc("subStr", NewGolangFunctor(subStrFunc), TypeString, []ExprFuncParam{ + ctx.RegisterFunc("strSub", NewGolangFunctor(subStrFunc), TypeString, []ExprFuncParam{ NewFuncParam(ParamSource), NewFuncParamFlagDef(ParamStart, PfDefault, int64(0)), NewFuncParamFlagDef(ParamCount, PfDefault, int64(-1)), }) - ctx.RegisterFunc("splitStr", NewGolangFunctor(splitStrFunc), "list of "+TypeString, []ExprFuncParam{ + ctx.RegisterFunc("strSplit", NewGolangFunctor(splitStrFunc), "list of "+TypeString, []ExprFuncParam{ NewFuncParam(ParamSource), NewFuncParamFlagDef(ParamSeparator, PfDefault, ""), NewFuncParamFlagDef(ParamCount, PfDefault, int64(-1)), }) - ctx.RegisterFunc("trimStr", NewGolangFunctor(trimStrFunc), TypeString, []ExprFuncParam{ + ctx.RegisterFunc("strTrim", NewGolangFunctor(trimStrFunc), TypeString, []ExprFuncParam{ NewFuncParam(ParamSource), }) - ctx.RegisterFunc("startsWithStr", NewGolangFunctor(startsWithStrFunc), TypeBoolean, []ExprFuncParam{ + ctx.RegisterFunc("strStartsWith", NewGolangFunctor(startsWithStrFunc), TypeBoolean, []ExprFuncParam{ NewFuncParam(ParamSource), NewFuncParam(ParamPrefix), NewFuncParamFlag("other "+ParamPrefix, PfRepeat), }) - ctx.RegisterFunc("endsWithStr", NewGolangFunctor(endsWithStrFunc), TypeBoolean, []ExprFuncParam{ + ctx.RegisterFunc("strEndsWith", NewGolangFunctor(endsWithStrFunc), TypeBoolean, []ExprFuncParam{ NewFuncParam(ParamSource), NewFuncParam(ParamSuffix), NewFuncParamFlag("other "+ParamSuffix, PfRepeat), diff --git a/common-errors.go b/common-errors.go index c4f6048..6f8be0f 100644 --- a/common-errors.go +++ b/common-errors.go @@ -8,7 +8,7 @@ import ( "fmt" ) -func errTooFewParams(funcName string, minArgs, maxArgs, argCount int) (err error) { +func ErrTooFewParams(funcName string, minArgs, maxArgs, argCount int) (err error) { if maxArgs < 0 { err = fmt.Errorf("%s(): too few params -- expected %d or more, got %d", funcName, minArgs, argCount) } else { @@ -17,39 +17,39 @@ func errTooFewParams(funcName string, minArgs, maxArgs, argCount int) (err error return } -func errTooMuchParams(funcName string, maxArgs, argCount int) (err error) { +func ErrTooMuchParams(funcName string, maxArgs, argCount int) (err error) { err = fmt.Errorf("%s(): too much params -- expected %d, got %d", funcName, maxArgs, argCount) return } // --- General errors -func errCantConvert(funcName string, value any, kind string) error { +func ErrCantConvert(funcName string, value any, kind string) error { return fmt.Errorf("%s(): can't convert %s to %s", funcName, TypeName(value), kind) } -func errExpectedGot(funcName string, kind string, value any) error { - return fmt.Errorf("%s() expected %s, got %s (%v)", funcName, kind, TypeName(value), value) +func ErrExpectedGot(funcName string, kind string, value any) error { + return fmt.Errorf("%s(): expected %s, got %s (%v)", funcName, kind, TypeName(value), value) } -func errFuncDivisionByZero(funcName string) error { +func ErrFuncDivisionByZero(funcName string) error { return fmt.Errorf("%s(): division by zero", funcName) } -func errDivisionByZero() error { +func ErrDivisionByZero() error { return fmt.Errorf("division by zero") } // --- Parameter errors -func errMissingRequiredParameter(funcName, paramName string) error { - return fmt.Errorf("%s() missing required parameter %q", funcName, paramName) +func ErrMissingRequiredParameter(funcName, paramName string) error { + return fmt.Errorf("%s(): missing required parameter %q", funcName, paramName) } -func errInvalidParameterValue(funcName, paramName string, paramValue any) error { - return fmt.Errorf("%s() invalid value %s (%v) for parameter %q", funcName, TypeName(paramValue), paramValue, paramName) +func ErrInvalidParameterValue(funcName, paramName string, paramValue any) error { + return fmt.Errorf("%s(): invalid value %s (%v) for parameter %q", funcName, TypeName(paramValue), paramValue, paramName) } -func errWrongParamType(funcName, paramName, paramType string, paramValue any) error { - return fmt.Errorf("%s() the %q parameter must be a %s, got a %s (%v)", funcName, paramName, paramType, TypeName(paramValue), paramValue) +func ErrWrongParamType(funcName, paramName, paramType string, paramValue any) error { + return fmt.Errorf("%s(): the %q parameter must be a %s, got a %s (%v)", funcName, paramName, paramType, TypeName(paramValue), paramValue) } diff --git a/fraction-type.go b/fraction-type.go index 42d6ce7..f5c7710 100644 --- a/fraction-type.go +++ b/fraction-type.go @@ -70,7 +70,7 @@ func makeGeneratingFraction(s string) (f *FractionType, err error) { } for _, c := range dec[0:lsd] { if c < '0' || c > '9' { - return nil, errExpectedGot("fract", "digit", c) + return nil, ErrExpectedGot("fract", "digit", c) } num = num*10 + int64(c-'0') den = den * 10 @@ -81,7 +81,7 @@ func makeGeneratingFraction(s string) (f *FractionType, err error) { mul := int64(1) for _, c := range subParts[0] { if c < '0' || c > '9' { - return nil, errExpectedGot("fract", "digit", c) + return nil, ErrExpectedGot("fract", "digit", c) } num = num*10 + int64(c-'0') sub = sub*10 + int64(c-'0') @@ -94,7 +94,7 @@ func makeGeneratingFraction(s string) (f *FractionType, err error) { p := subParts[1][0 : len(subParts[1])-1] for _, c := range p { if c < '0' || c > '9' { - return nil, errExpectedGot("fract", "digit", c) + return nil, ErrExpectedGot("fract", "digit", c) } num = num*10 + int64(c-'0') den = den*10 + 9 @@ -212,7 +212,7 @@ func anyToFract(v any) (f *FractionType, err error) { } } if f == nil { - err = errExpectedGot("fract", TypeFraction, v) + err = ErrExpectedGot("fract", TypeFraction, v) } return } diff --git a/operand-func.go b/operand-func.go index 87fb8c7..da750a3 100644 --- a/operand-func.go +++ b/operand-func.go @@ -26,7 +26,7 @@ func checkFunctionCall(ctx ExprContext, name string, varParams *[]any) (err erro if info, exists, owner := GetFuncInfo(ctx, name); exists { passedCount := len(*varParams) if info.MinArgs() > passedCount { - err = errTooFewParams(name, info.MinArgs(), info.MaxArgs(), passedCount) + err = ErrTooFewParams(name, info.MinArgs(), info.MaxArgs(), passedCount) } for i, p := range info.Params() { if i >= passedCount { @@ -37,7 +37,7 @@ func checkFunctionCall(ctx ExprContext, name string, varParams *[]any) (err erro } } if err == nil && info.MaxArgs() >= 0 && info.MaxArgs() < len(*varParams) { - err = errTooMuchParams(name, info.MaxArgs(), len(*varParams)) + err = ErrTooMuchParams(name, info.MaxArgs(), len(*varParams)) } if err == nil && owner != ctx { ctx.RegisterFuncInfo(info) diff --git a/t_builtin-base_test.go b/t_builtin-base_test.go index 527e2e2..cdf262d 100644 --- a/t_builtin-base_test.go +++ b/t_builtin-base_test.go @@ -1,7 +1,7 @@ // Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. -// t_func-base_test.go +// t_builtin-base_test.go package expr import ( @@ -10,7 +10,7 @@ import ( ) func TestFuncBase(t *testing.T) { - section := "Func-Base" + section := "Builtin-Base" inputs := []inputType{ /* 1 */ {`isNil(nil)`, true, nil}, diff --git a/t_builtin-import_test.go b/t_builtin-import_test.go index 6f8574b..b521fa3 100644 --- a/t_builtin-import_test.go +++ b/t_builtin-import_test.go @@ -1,7 +1,7 @@ // Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. -// t_func-import_test.go +// t_builtin-import_test.go package expr import ( @@ -9,15 +9,15 @@ import ( ) func TestFuncImport(t *testing.T) { - section := "Func-Import" + section := "Builtin-Import" inputs := []inputType{ - /* 1 */ {`builtin "import"; import("./test-funcs.expr"); (double(3+a) + 1) * two()`, int64(34), nil}, + /* 1 */ {`builtin "import"; import("./test-resources/test-funcs.expr"); (double(3+a) + 1) * two()`, int64(34), nil}, /* 2 */ {`builtin "import"; import("test-funcs.expr"); (double(3+a) + 1) * two()`, int64(34), nil}, - /* 3 */ {`builtin "import"; importAll("./test-funcs.expr"); six()`, int64(6), nil}, - /* 4 */ {`builtin "import"; import("./sample-export-all.expr"); six()`, int64(6), nil}, + /* 3 */ {`builtin "import"; importAll("./test-resources/test-funcs.expr"); six()`, int64(6), nil}, + /* 4 */ {`builtin "import"; import("./test-resources/sample-export-all.expr"); six()`, int64(6), nil}, } - t.Setenv("EXPR_PATH", ".") + t.Setenv("EXPR_PATH", "test-resources") // parserTestSpec(t, section, inputs, 69) parserTest(t, section, inputs) diff --git a/t_builtin-math-arith_test.go b/t_builtin-math-arith_test.go index 12bd920..5d2f9e4 100644 --- a/t_builtin-math-arith_test.go +++ b/t_builtin-math-arith_test.go @@ -1,7 +1,7 @@ // Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. -// t_func-math-arith_test.go +// t_builtin-math-arith_test.go package expr import ( @@ -10,7 +10,7 @@ import ( ) func TestFuncMathArith(t *testing.T) { - section := "Func-Math-Arith" + section := "Builtin-Math-Arith" inputs := []inputType{ /* 1 */ {`builtin "math.arith"; add(1,2)`, int64(3), nil}, /* 2 */ {`builtin "math.arith"; add(1,2,3)`, int64(6), nil}, diff --git a/t_builtin-os-file_test.go b/t_builtin-os-file_test.go index 390796e..c86c5a1 100644 --- a/t_builtin-os-file_test.go +++ b/t_builtin-os-file_test.go @@ -1,7 +1,7 @@ // Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. -// t_func-os_test.go +// t_builtin-os-file_test.go package expr import ( @@ -10,7 +10,7 @@ import ( ) func TestFuncOs(t *testing.T) { - section := "Func-OS" + section := "Builtin-OS-File" inputs := []inputType{ /* 1 */ {`builtin "os.file"`, int64(1), nil}, /* 2 */ {`builtin "os.file"; handle=fileOpen("/etc/hosts"); fileClose(handle)`, true, nil}, diff --git a/t_builtin-string_test.go b/t_builtin-string_test.go index dcbdb58..904b6de 100644 --- a/t_builtin-string_test.go +++ b/t_builtin-string_test.go @@ -1,7 +1,7 @@ // Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. -// t_func-string_test.go +// t_builtin-string_test.go package expr import ( @@ -10,28 +10,28 @@ import ( ) func TestFuncString(t *testing.T) { - section := "Func-String" + section := "Builtin-String" inputs := []inputType{ - /* 1 */ {`builtin "string"; joinStr("-", "one", "two", "three")`, "one-two-three", nil}, - /* 2 */ {`builtin "string"; joinStr("-", ["one", "two", "three"])`, "one-two-three", nil}, - /* 3 */ {`builtin "string"; ls= ["one", "two", "three"]; joinStr("-", ls)`, "one-two-three", nil}, - /* 4 */ {`builtin "string"; ls= ["one", "two", "three"]; joinStr(1, ls)`, nil, errors.New(`joinStr() the "separator" parameter must be a string, got a integer (1)`)}, - /* 5 */ {`builtin "string"; ls= ["one", 2, "three"]; joinStr("-", ls)`, nil, errors.New(`joinStr() expected string, got integer (2)`)}, - /* 6 */ {`builtin "string"; "<"+trimStr(" bye bye ")+">"`, "", nil}, - /* 7 */ {`builtin "string"; subStr("0123456789", 1,2)`, "12", nil}, - /* 8 */ {`builtin "string"; subStr("0123456789", -3,2)`, "78", nil}, - /* 9 */ {`builtin "string"; subStr("0123456789", -3)`, "789", nil}, - /* 10 */ {`builtin "string"; subStr("0123456789")`, "0123456789", nil}, - /* 11 */ {`builtin "string"; startsWithStr("0123456789", "xyz", "012")`, true, nil}, - /* 12 */ {`builtin "string"; startsWithStr("0123456789", "xyz", "0125")`, false, nil}, - /* 13 */ {`builtin "string"; startsWithStr("0123456789")`, nil, errors.New(`startsWithStr(): too few params -- expected 2 or more, got 1`)}, - /* 14 */ {`builtin "string"; endsWithStr("0123456789", "xyz", "789")`, true, nil}, - /* 15 */ {`builtin "string"; endsWithStr("0123456789", "xyz", "0125")`, false, nil}, - /* 16 */ {`builtin "string"; endsWithStr("0123456789")`, nil, errors.New(`endsWithStr(): too few params -- expected 2 or more, got 1`)}, - /* 17 */ {`builtin "string"; splitStr("one-two-three", "-")`, newListA("one", "two", "three"), nil}, - /* 18 */ {`builtin "string"; joinStr("-", [1, "two", "three"])`, nil, errors.New(`joinStr() expected string, got integer (1)`)}, - /* 19 */ {`builtin "string"; joinStr()`, nil, errors.New(`joinStr(): too few params -- expected 1 or more, got 0`)}, + /* 1 */ {`builtin "string"; strJoin("-", "one", "two", "three")`, "one-two-three", nil}, + /* 2 */ {`builtin "string"; strJoin("-", ["one", "two", "three"])`, "one-two-three", nil}, + /* 3 */ {`builtin "string"; ls= ["one", "two", "three"]; strJoin("-", ls)`, "one-two-three", nil}, + /* 4 */ {`builtin "string"; ls= ["one", "two", "three"]; strJoin(1, ls)`, nil, errors.New(`strJoin(): the "separator" parameter must be a string, got a integer (1)`)}, + /* 5 */ {`builtin "string"; ls= ["one", 2, "three"]; strJoin("-", ls)`, nil, errors.New(`strJoin(): expected string, got integer (2)`)}, + /* 6 */ {`builtin "string"; "<"+strTrim(" bye bye ")+">"`, "", nil}, + /* 7 */ {`builtin "string"; strSub("0123456789", 1,2)`, "12", nil}, + /* 8 */ {`builtin "string"; strSub("0123456789", -3,2)`, "78", nil}, + /* 9 */ {`builtin "string"; strSub("0123456789", -3)`, "789", nil}, + /* 10 */ {`builtin "string"; strSub("0123456789")`, "0123456789", nil}, + /* 11 */ {`builtin "string"; strStartsWith("0123456789", "xyz", "012")`, true, nil}, + /* 12 */ {`builtin "string"; strStartsWith("0123456789", "xyz", "0125")`, false, nil}, + /* 13 */ {`builtin "string"; strStartsWith("0123456789")`, nil, errors.New(`strStartsWith(): too few params -- expected 2 or more, got 1`)}, + /* 14 */ {`builtin "string"; strEndsWith("0123456789", "xyz", "789")`, true, nil}, + /* 15 */ {`builtin "string"; strEndsWith("0123456789", "xyz", "0125")`, false, nil}, + /* 16 */ {`builtin "string"; strEndsWith("0123456789")`, nil, errors.New(`strEndsWith(): too few params -- expected 2 or more, got 1`)}, + /* 17 */ {`builtin "string"; strSplit("one-two-three", "-")`, newListA("one", "two", "three"), nil}, + /* 18 */ {`builtin "string"; strJoin("-", [1, "two", "three"])`, nil, errors.New(`strJoin(): expected string, got integer (1)`)}, + /* 19 */ {`builtin "string"; strJoin()`, nil, errors.New(`strJoin(): too few params -- expected 1 or more, got 0`)}, /* 69 */ /*{`builtin "string"; $$global`, `vars: { }