/
status.go
121 lines (106 loc) · 2.05 KB
/
status.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package errors
import (
"fmt"
"net/http"
"strconv"
"strings"
)
const (
OK StatusCode = iota
Cancelled
Unknown
InvalidArgument
DeadlineExceeded
NotFound
AlreadyExists
PermissionDenied
ResourceExhausted
FailedPrecondition
Aborted
OutOfRange
Unimplemented
Internal
Unavailable
DataLoss
Unauthenticated
totalStatus
)
var (
statusList = [totalStatus]StatusName{
"OK",
"CANCELLED",
"UNKNOWN",
"INVALID_ARGUMENT",
"DEADLINE_EXCEEDED",
"NOT_FOUND",
"ALREADY_EXISTS",
"PERMISSION_DENIED",
"RESOURCE_EXHAUSTED",
"FAILED_PRECONDITION",
"ABORTED",
"OUT_OF_RANGE",
"UNIMPLEMENTED",
"INTERNAL",
"UNAVAILABLE",
"DATA_LOSS",
"UNAUTHENTICATED",
}
httpList = [totalStatus]int{
http.StatusOK,
499,
http.StatusInternalServerError,
http.StatusBadRequest,
http.StatusGatewayTimeout,
http.StatusNotFound,
http.StatusConflict,
http.StatusForbidden,
http.StatusTooManyRequests,
http.StatusBadRequest,
http.StatusConflict,
http.StatusBadRequest,
http.StatusNotImplemented,
http.StatusInternalServerError,
http.StatusServiceUnavailable,
http.StatusInternalServerError,
http.StatusUnauthorized,
}
)
type StatusCode int
func (c StatusCode) Annotate(m Modifier) {
m.SetCode(c)
}
func (c StatusCode) Valid() bool {
return c >= 0 && c < totalStatus
}
func (c StatusCode) Error() string {
return fmt.Sprintf("%d %s", c.Http(), c.String())
}
func (c StatusCode) Temporary() bool {
return c == Unavailable
}
func (c StatusCode) Name() StatusName {
if c.Valid() {
return statusList[c]
}
return StatusName("Code(" + strconv.FormatInt(int64(c), 10) + ")")
}
func (c StatusCode) String() string { return string(c.Name()) }
func (c StatusCode) Http() int {
if c.Valid() {
return httpList[c]
}
return http.StatusInternalServerError
}
type StatusName string
func (s StatusName) StatusCode() StatusCode {
name := StatusName(s.String())
for i, value := range statusList {
if name == value {
return StatusCode(i)
}
}
return Unknown
}
func (s StatusName) String() string {
return strings.ToUpper(string(s))
}