package errors
import (
"net/http"
"github.com/go-openapi/swag"
dapi "github.com/vmware/dispatch/pkg/api/v1"
)
type ErrorReason string
const ReasonDriver ErrorReason = "DriverError"
const ReasonObjectMarshal ErrorReason = "ObjectMarshallError"
const ReasonObjectNotFound ErrorReason = "ObjectNotFound"
const ReasonRequest ErrorReason = "RequestError"
const ReasonServer ErrorReason = "ServerError"
const ReasonUnknown ErrorReason = "UnknownError"
type ReasonedError interface {
Reason() ErrorReason
}
type DispatchError struct {
APIError dapi.Error `json:"error"`
ErrorReason ErrorReason `json:"reason"`
}
func (e *DispatchError) Error() string {
return *e.APIError.Message
}
func (e *DispatchError) Reason() ErrorReason {
return e.ErrorReason
}
func GetError(err error) *dapi.Error {
if derr, ok := err.(*DispatchError); ok {
return &derr.APIError
}
return nil
}
func ReasonForError(err error) ErrorReason {
switch t := err.(type) {
case ReasonedError:
return t.Reason()
}
return ReasonUnknown
}
func NewDriverError(err error) *DispatchError {
return &DispatchError{
APIError: dapi.Error{
Message: swag.String(err.Error()),
Code: http.StatusInternalServerError,
},
ErrorReason: ReasonDriver,
}
}
func IsDriverError(err error) bool {
return ReasonForError(err) == ReasonDriver
}
func NewObjectNotFoundError(err error) *DispatchError {
return &DispatchError{
APIError: dapi.Error{
Message: swag.String(err.Error()),
Code: http.StatusNotFound,
},
ErrorReason: ReasonObjectNotFound,
}
}
func IsObjectNotFound(err error) bool {
return ReasonForError(err) == ReasonObjectNotFound
}
func NewObjectMarshalError(err error) *DispatchError {
return &DispatchError{
APIError: dapi.Error{
Message: swag.String(err.Error()),
Code: http.StatusBadRequest,
},
ErrorReason: ReasonObjectMarshal,
}
}
func IsObjectMarshall(err error) bool {
return ReasonForError(err) == ReasonObjectMarshal
}
func NewServerError(err error) *DispatchError {
return &DispatchError{
APIError: dapi.Error{
Message: swag.String(err.Error()),
Code: http.StatusInternalServerError,
},
ErrorReason: ReasonServer,
}
}
func IsServer(err error) bool {
return ReasonForError(err) == ReasonServer
}
func NewRequestError(err error) *DispatchError {
return &DispatchError{
APIError: dapi.Error{
Message: swag.String(err.Error()),
Code: http.StatusBadRequest,
},
ErrorReason: ReasonRequest,
}
}
func IsRequest(err error) bool {
return ReasonForError(err) == ReasonRequest
}