-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
84 lines (63 loc) · 1.11 KB
/
main.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
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
type Handler func(c *gin.Context) any
type Error struct {
Code int
Error string
}
func myAdapter(h Handler) gin.HandlerFunc {
return func(c *gin.Context) {
res := h(c)
switch v := res.(type) {
case gin.H:
// here v has type T
c.JSON(
http.StatusOK,
v,
)
case Error:
// here v has type S
c.JSON(
v.Code,
gin.H{"error": v.Error},
)
default:
c.JSON(
http.StatusExpectationFailed,
gin.H{
"error": "Unknown handler response",
},
)
}
}
}
func main() {
r := gin.Default()
r.GET("/test", myAdapter(HelloHandler))
r.GET("/test_error", myAdapter(ErrorHandler))
r.GET("/test_not_found", myAdapter(ErrorNotFoundHandler))
err := r.Run()
if err != nil {
panic(err)
}
}
func HelloHandler(c *gin.Context) any {
return gin.H{
"data": "Hello World",
}
}
func ErrorHandler(c *gin.Context) any {
return Error{
http.StatusInternalServerError,
"Sample error",
}
}
func ErrorNotFoundHandler(c *gin.Context) any {
return Error{
http.StatusNotFound,
"Error not found",
}
}