/
error.go
82 lines (67 loc) · 2.27 KB
/
error.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package api
import (
"net/http"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
const (
humanErrorInvalidRegex string = "must be less than 36 characters and may only use lowercase letters, numbers, and “-_”"
// GenericErrorCode - Reserved status code for generic non grpc errors
GenericErrorCode codes.Code = 50
)
// ErrObject for grpc
type ErrObject struct {
Code codes.Code
Message string
}
var grpcErrorHTTPCodeMap = map[codes.Code]int{
codes.Canceled: http.StatusBadRequest,
codes.Unknown: http.StatusInternalServerError,
codes.InvalidArgument: http.StatusNotAcceptable,
codes.DeadlineExceeded: http.StatusBadRequest,
codes.NotFound: http.StatusNotFound,
codes.AlreadyExists: http.StatusConflict,
codes.PermissionDenied: http.StatusBadRequest,
codes.ResourceExhausted: http.StatusBadRequest,
codes.FailedPrecondition: http.StatusBadRequest,
codes.Aborted: http.StatusBadRequest,
codes.OutOfRange: http.StatusBadRequest,
codes.Unimplemented: http.StatusBadRequest,
codes.Internal: http.StatusBadRequest,
codes.Unavailable: http.StatusBadRequest,
codes.DataLoss: http.StatusBadRequest,
codes.Unauthenticated: http.StatusBadRequest,
GenericErrorCode: http.StatusInternalServerError,
}
// ConvertGRPCStatusCodeToHTTPCode - Convert Grpc Code errors to http response codes
func ConvertGRPCStatusCodeToHTTPCode(code codes.Code) int {
if val, ok := grpcErrorHTTPCodeMap[code]; ok {
return val
}
return http.StatusInternalServerError
}
// GenerateErrObject - Unwrap grpc errors into ErrorObject
func GenerateErrObject(err error) *ErrObject {
eo := new(ErrObject)
if st, ok := status.FromError(err); ok {
eo.Code = st.Code()
eo.Message = st.Message()
} else {
eo.Code = GenericErrorCode
eo.Message = err.Error()
}
// // Handle Certain Erros
// if eo.isRegexError() {
// eo.Message = strings.Replace(eo.Message, `must match regex: ^[a-z][a-z0-9._-]{1,34}[a-z0-9]$`, humanErrorInvalidRegex, 1)
// }
return eo
}
// func (e *ErrObject) isRegexError() (ok bool) {
// if e.Code != codes.InvalidArgument {
// ok = false
// } else if strings.HasSuffix(e.Message, `^[a-z][a-z0-9._-]{1,34}[a-z0-9]$`) {
// ok = true
// }
//
// return ok
// }