Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sundowndev
GitHub Repository: sundowndev/phoneinfoga
Path: blob/master/web/v2/api/response.go
994 views
1
package api
2
3
import (
4
"github.com/gin-gonic/gin"
5
"net/http"
6
)
7
8
type HandlerFunc func(ctx *gin.Context) *Response
9
10
type Response struct {
11
Code int
12
Headers http.Header
13
Data interface{}
14
JSON bool
15
}
16
17
type ErrorResponse struct {
18
Error string `json:"error"`
19
}
20
21
func WrapHandler(h HandlerFunc) gin.HandlerFunc {
22
return func(ctx *gin.Context) {
23
defer func() {
24
if err := recover(); err != nil {
25
ctx.AbortWithStatusJSON(500, ErrorResponse{Error: "Unknown error"})
26
}
27
}()
28
29
res := h(ctx)
30
if res == nil {
31
ctx.Abort()
32
return
33
}
34
for key, values := range res.Headers {
35
for _, val := range values {
36
ctx.Writer.Header().Add(key, val)
37
}
38
}
39
if res.JSON && res.Data != nil {
40
ctx.JSON(res.Code, res.Data)
41
return
42
}
43
ctx.Writer.WriteHeader(res.Code)
44
if _, ok := res.Data.([]byte); ok {
45
_, _ = ctx.Writer.Write(res.Data.([]byte))
46
}
47
}
48
}
49
50