Files
cloudpods/pkg/cloudcommon/validators/errors.go
2018-08-30 07:47:08 +00:00

107 lines
2.6 KiB
Go

package validators
import (
"fmt"
)
type ErrType uintptr
const (
ERR_SUCCESS ErrType = iota
ERR_GENERAL // uncategorized error
ERR_MISSING_KEY
ERR_INVALID_TYPE
ERR_INVALID_CHOICE
ERR_NOT_IN_RANGE
ERR_INVALID_VALUE
ERR_MODEL_MANAGER
ERR_MODEL_NOT_FOUND
)
var errTypeToString = map[ErrType]string{
ERR_SUCCESS: "No error",
ERR_GENERAL: "General error",
ERR_MISSING_KEY: "Missing_key error",
ERR_INVALID_TYPE: "Invalid type error",
ERR_INVALID_CHOICE: "Invalid choice error",
ERR_NOT_IN_RANGE: "Not in range error",
ERR_INVALID_VALUE: "Invalid value error",
ERR_MODEL_MANAGER: "Model manager error",
ERR_MODEL_NOT_FOUND: "Model not found error",
}
func (errType ErrType) String() string {
s, ok := errTypeToString[errType]
if ok {
return s
}
return "unknown error"
}
type ValidateError struct {
ErrType ErrType
Msg string
}
func (ve *ValidateError) Error() string {
return ve.Msg
}
// TODO let each validator provide the error
func newMissingKeyError(key string) error {
msg := fmt.Sprintf("missing %q", key)
return newError(ERR_MISSING_KEY, msg)
}
func newGeneralError(key string, err error) error {
msg := fmt.Sprintf("general error for %q: %s", key, err)
return newError(ERR_GENERAL, msg)
}
func newInvalidTypeError(key string, typ string, err error) error {
msg := fmt.Sprintf("expecting %s type for %q: %s", typ, key, err)
return newError(ERR_INVALID_TYPE, msg)
}
func newInvalidChoiceError(key string, choices Choices, choice string) error {
msg := fmt.Sprintf("invalid %q, want %s, got %s", key, choices, choice)
return newError(ERR_INVALID_CHOICE, msg)
}
func newNotInRangeError(key string, value, lower, upper int64) error {
msg := fmt.Sprintf("invalid %q: %d, want [%d,%d]", key, value, lower, upper)
return newError(ERR_NOT_IN_RANGE, msg)
}
func newInvalidValueError(key string, value string) error {
msg := fmt.Sprintf("invalid %q: %s", key, value)
return newError(ERR_INVALID_VALUE, msg)
}
func newModelManagerError(modelKeyword string) error {
msg := fmt.Sprintf("internal error: getting model manager for %q failed",
modelKeyword)
return newError(ERR_MODEL_MANAGER, msg)
}
func newModelNotFoundError(modelKeyword, idOrName string, err error) error {
msg := fmt.Sprintf("cannot find %q with id/name %q: %s",
modelKeyword, idOrName, err)
return newError(ERR_MODEL_NOT_FOUND, msg)
}
func newError(typ ErrType, msg string) error {
return &ValidateError{
ErrType: typ,
Msg: msg,
}
}
func IsModelNotFoundError(err error) bool {
ve, ok := err.(*ValidateError)
if ok && ve.ErrType == ERR_MODEL_NOT_FOUND {
return true
}
return false
}