diff --git a/operator.go b/operator.go index 2a22cef..188e965 100644 --- a/operator.go +++ b/operator.go @@ -6,7 +6,8 @@ import ( // Operator error. var ( - ErrInvalidOperator = errors.New("invalid operator") + ErrInvalidOperator = errors.New("invalid operator") + ErrInvalidOperatorForType = errors.New("invalid operator for type") ) var ( @@ -36,93 +37,73 @@ var ( "not like": "NOT LIKE", } - arrayOperators = []string{"IN", "NOT IN"} - boolOperators = []string{"==", "!="} - numberOperators = []string{"==", "!=", ">", ">=", "<", "<="} - stringOperators = []string{"==", "!=", ">", ">=", "<", "<=", "LIKE", "NOT LIKE"} + arrayOperators = map[string]bool{"IN": true, "NOT IN": true} + boolOperators = map[string]bool{"==": true, "!=": true} + numberOperators = map[string]bool{"==": true, "!=": true, ">": true, ">=": true, "<": true, "<=": true} + stringOperators = map[string]bool{"==": true, "!=": true, ">": true, ">=": true, "<": true, "<=": true, "LIKE": true, "NOT LIKE": true} ) // IsArrayOperator returns true if the given operator can be used with an array value. func IsArrayOperator(op string) bool { - op, _ = ParseOperator(op) - if op == "" { - return false - } - for _, arrOp := range arrayOperators { - if arrOp == op { - return true - } - } - return false + _, err := ParseArrayOperator(op) + return err == nil } // IsBoolOperator returns true if the given operator can be used with a Boolean value. func IsBoolOperator(op string) bool { - op, _ = ParseOperator(op) - if op == "" { - return false - } - for _, boolOp := range boolOperators { - if boolOp == op { - return true - } - } - return false + _, err := ParseBoolOperator(op) + return err == nil } // IsNumberOperator returns true if the given operator can be used with a numeric value. func IsNumberOperator(op string) bool { - op, _ = ParseOperator(op) - if op == "" { - return false - } - for _, numOp := range numberOperators { - if numOp == op { - return true - } - } - return false + _, err := ParseNumberOperator(op) + return err == nil } // IsStringOperator returns true if the given operator can be used with a string value. func IsStringOperator(op string) bool { - op, _ = ParseOperator(op) - if op == "" { - return false - } - for _, strOp := range stringOperators { - if strOp == op { - return true - } - } - return false + _, err := ParseStringOperator(op) + return err == nil } // ParseArrayOperator returns the valid AQL operator for an array operator. // It returns an error if the operator cannot be mapped to AQL or does not support arrays. func ParseArrayOperator(op string) (string, error) { - if !IsArrayOperator(op) { - return "", ErrInvalidOperator + op, err := ParseOperator(op) + if err != nil { + return op, err } - return ParseOperator(op) + if !arrayOperators[op] { + return op, ErrInvalidOperatorForType + } + return op, nil } // ParseBoolOperator returns the valid AQL operator for a Boolean operator. // It returns an error if the operator cannot be mapped to AQL or does not support Booleans. func ParseBoolOperator(op string) (string, error) { - if !IsBoolOperator(op) { - return "", ErrInvalidOperator + op, err := ParseOperator(op) + if err != nil { + return op, err } - return ParseOperator(op) + if !boolOperators[op] { + return op, ErrInvalidOperatorForType + } + return op, nil } // ParseNumberOperator returns the valid AQL operator for a numeric operator. // It returns an error if the operator cannot be mapped to AQL or does not support numbers. func ParseNumberOperator(op string) (string, error) { - if !IsNumberOperator(op) { - return "", ErrInvalidOperator + op, err := ParseOperator(op) + if err != nil { + return op, err } - return ParseOperator(op) + if !numberOperators[op] { + return op, ErrInvalidOperatorForType + } + return op, nil } // ParseOperator returns the valid AQL operator for an arbitrary operator string. @@ -139,8 +120,12 @@ func ParseOperator(op string) (string, error) { // ParseStringOperator returns the valid AQL operator for a string operator. // It returns an error if the operator cannot be mapped to AQL or does not support strings. func ParseStringOperator(op string) (string, error) { - if !IsStringOperator(op) { - return "", ErrInvalidOperator + op, err := ParseOperator(op) + if err != nil { + return op, err } - return ParseOperator(op) + if !stringOperators[op] { + return op, ErrInvalidOperatorForType + } + return op, nil }