// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. // func-builtins.go package expr import ( "math" "strconv" ) func isNilFunc(ctx ExprContext, name string, args []any) (result any, err error) { if len(args) == 1 { result = args[0] == nil } else { err = errOneParam(name) } return } func isIntFunc(ctx ExprContext, name string, args []any) (result any, err error) { result = IsInteger(args[0]) return } func isFloatFunc(ctx ExprContext, name string, args []any) (result any, err error) { result = IsFloat(args[0]) return } func isBoolFunc(ctx ExprContext, name string, args []any) (result any, err error) { result = IsBool(args[0]) return } func isStringFunc(ctx ExprContext, name string, args []any) (result any, err error) { result = IsString(args[0]) return } func isFractionFunc(ctx ExprContext, name string, args []any) (result any, err error) { result = IsFract(args[0]) return } func isRationalFunc(ctx ExprContext, name string, args []any) (result any, err error) { result = IsRational(args[0]) return } func isListFunc(ctx ExprContext, name string, args []any) (result any, err error) { result = IsList(args[0]) return } func isDictionaryFunc(ctx ExprContext, name string, args []any) (result any, err error) { result = IsDict(args[0]) return } func intFunc(ctx ExprContext, name string, args []any) (result any, err error) { if len(args) == 1 { switch v := args[0].(type) { case int64: result = v case float64: result = int64(math.Trunc(v)) case bool: if v { result = int64(1) } else { result = int64(0) } case string: var i int if i, err = strconv.Atoi(v); err == nil { result = int64(i) } default: err = errCantConvert(name, v, "int") } } else { err = errOneParam(name) } return } func iteratorFunc(ctx ExprContext, name string, args []any) (result any, err error) { return } func ImportBuiltinsFuncs(ctx ExprContext) { ctx.RegisterFunc("isNil", &simpleFunctor{f: isNilFunc}, 1, 1) ctx.RegisterFunc("isInt", &simpleFunctor{f: isIntFunc}, 1, 1) ctx.RegisterFunc("isFloat", &simpleFunctor{f: isFloatFunc}, 1, 1) ctx.RegisterFunc("isBool", &simpleFunctor{f: isBoolFunc}, 1, 1) ctx.RegisterFunc("isString", &simpleFunctor{f: isStringFunc}, 1, 1) ctx.RegisterFunc("isFraction", &simpleFunctor{f: isFractionFunc}, 1, 1) ctx.RegisterFunc("isFract", &simpleFunctor{f: isFractionFunc}, 1, 1) ctx.RegisterFunc("isRational", &simpleFunctor{f: isRationalFunc}, 1, 1) ctx.RegisterFunc("isList", &simpleFunctor{f: isListFunc}, 1, 1) ctx.RegisterFunc("isDictionary", &simpleFunctor{f: isDictionaryFunc}, 1, 1) ctx.RegisterFunc("isDict", &simpleFunctor{f: isDictionaryFunc}, 1, 1) ctx.RegisterFunc("int", &simpleFunctor{f: intFunc}, 1, 1) } func init() { registerImport("base", ImportBuiltinsFuncs, "Base expression tools like isNil(), int(), etc.") }