7 "github.com/gin-gonic/gin"
16 func (e Error) Err() error {
24 func (e Error) Error() string {
32 func NewInternalError(err error) *Error {
33 return &Error{InternalError, "internal error", err}
36 func ToSnake(in string) string {
41 for i := 0; i < length; i++ {
42 if i > 0 && unicode.IsUpper(runes[i]) && ((i+1 < length && unicode.IsLower(runes[i+1])) || unicode.IsLower(runes[i-1])) {
43 out = append(out, '_')
45 out = append(out, unicode.ToLower(runes[i]))
51 type Response struct {
52 StatusCode Status `json:"-"`
53 ErrorCode ErrorCode `json:"-"`
55 Status string `json:"status"`
56 Code string `json:"code,omitempty"`
57 Response interface{} `json:"response,omitempty"`
58 Message string `json:"message,omitempty"`
61 func (r Response) populateStatus() Response {
62 r.Status = ToSnake(r.StatusCode.String())
65 r.Code = ToSnake(r.ErrorCode.String())
71 func ErrorResponse(code ErrorCode, message string) Response {
79 func SuccessResponse(data interface{}) Response {
86 func WriteJsonResponse(response Response, c *gin.Context) {
87 response = response.populateStatus()
89 c.JSON(StatusToHttpCode(response.StatusCode, response.ErrorCode), response)
92 func WriteBinary(contentType string, b []byte, c *gin.Context) {
93 c.Data(http.StatusOK, contentType, b)
96 type Middleware func(*gin.Context) *Error
98 func M(handler Middleware) gin.HandlerFunc {
99 return func(c *gin.Context) {
103 WriteJsonResponse(ErrorResponse(err.Code, err.UserMessage), c)
112 type Query interface {
113 ValidateParams() *Error
114 Run() (interface{}, *Error)
117 func RunQuery(query Query, c *gin.Context) {
118 if err := query.ValidateParams(); err != nil {
119 WriteJsonResponse(ErrorResponse(err.Code, err.UserMessage), c)
124 if out, err := query.Run(); err != nil {
125 WriteJsonResponse(ErrorResponse(err.Code, err.UserMessage), c)
128 WriteJsonResponse(SuccessResponse(out), c)