package result import ( "errors" "github.com/gin-gonic/gin" "net/http" "strconv" ) var ( Ok = NewResponse(WithCode(200), WithMsg("success")) Created = NewResponse(WithCode(201), WithFlag(true), WithMsg("created")) InvalidParams = NewResponse(WithCode(400), WithFlag(false), WithMsg("invalid params")) Unauthorized = NewResponse(WithCode(401), WithFlag(false), WithMsg("unauthorized")) Forbidden = NewResponse(WithCode(403), WithFlag(false), WithMsg("forbidden")) NotFound = NewResponse(WithCode(404), WithFlag(false), WithMsg("not found")) TooManyRequests = NewResponse(WithCode(429), WithFlag(false), WithMsg("too many requests")) Wrong = NewResponse(WithCode(500), WithFlag(false), WithMsg("something wrong")) ) type Response struct { Code int `json:"code"` Msg string `json:"msg"` Data interface{} `json:"data"` } type ResponseOption func(*Response) func NewResponse(options ...ResponseOption) *Response { resp := &Response{} for _, option := range options { option(resp) } return resp } // WithCode code:code func (r *Response) WithCode(code int) *Response { r.Code = code return r } // WithMsg msg:msg func (r *Response) WithMsg(msg string) *Response { r.Msg = msg return r } // WithData data:data func (r *Response) WithData(data interface{}) *Response { r.Data = data return r } // WithVoidData data:nil func (r *Response) WithVoidData() *Response { r.Data = nil return r } // WithFlag data:{"flag":flag} func (r *Response) WithFlag(flag bool) *Response { r.Data = gin.H{"flag": flag} return r } // WithFV data:{"flag":flag, "value":value} func (r *Response) WithFV(flag bool, value interface{}) *Response { r.Data = gin.H{"flag": flag, "value": value} return r } // WithVoidFV data:{"flag":false, "value":nil} func (r *Response) WithVoidFV() *Response { r.Data = gin.H{"flag": false, "value": nil} return r } // WithFullFV data:{"flag":true, "value":value} func (r *Response) WithFullFV(value interface{}) *Response { r.Data = gin.H{"flag": true, "value": value} return r } func WithCode(code int) ResponseOption { return func(resp *Response) { resp.Code = code } } func WithMsg(msg string) ResponseOption { return func(resp *Response) { resp.Msg = msg } } func WithData(data interface{}) ResponseOption { return func(resp *Response) { resp.Data = data } } func WithFlag(flag bool) ResponseOption { return func(resp *Response) { resp.Data = gin.H{"flag": flag} } } func WithFlagValue(flag bool, value interface{}) ResponseOption { return func(resp *Response) { resp.Data = gin.H{"flag": flag, "value": value} } } func (r *Response) Response(c *gin.Context, httpCode int) { c.JSON(httpCode, &r) } func (r *Response) Success(c *gin.Context) { r.Response(c, http.StatusOK) } func (r *Response) Failure(c *gin.Context) { r.Response(c, http.StatusOK) } func (r *Response) Error(c *gin.Context) { r.Response(c, http.StatusInternalServerError) } func (r *Response) ToError() error { return errors.New("code:" + strconv.Itoa(r.Code) + ", msg:" + r.Msg) }