-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathroute.go
94 lines (76 loc) · 2.43 KB
/
route.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
package sal
import (
"net/http"
"regexp"
"strings"
"github.com/go-swagno/swagno/components/endpoint"
"github.com/go-swagno/swagno/components/http/response"
"github.com/go-swagno/swagno/components/mime"
"github.com/go-swagno/swagno/components/parameter"
)
func getHeaders(headers []Header) []*parameter.Parameter {
endpointsConfig := []*parameter.Parameter{}
for _, v := range headers {
if v.Required {
endpointsConfig = append(
endpointsConfig,
parameter.StrParam(v.Name, parameter.Header, parameter.WithRequired()),
)
continue
}
endpointsConfig = append(
endpointsConfig,
parameter.StrParam(v.Name, parameter.Header, parameter.WithDefault(nil)),
)
}
return endpointsConfig
}
func getPathParameters(route string) []*parameter.Parameter {
r := regexp.MustCompile(`{(\w+)}`)
matches := r.FindAllString(route, -1)
endpointsConfig := []*parameter.Parameter{}
for _, match := range matches {
match = strings.Trim(match, "{}")
endpointsConfig = append(endpointsConfig, parameter.StrParam(
match, parameter.Path, parameter.WithRequired(),
))
}
return endpointsConfig
}
func makeEndpoint(route, method, tag string, resp Response, body any, headers []Header) *endpoint.EndPoint {
allParameters := append(getPathParameters(route), getHeaders(headers)...)
endpoint := endpoint.New(
endpoint.MethodType(method),
route,
endpoint.WithParams(
allParameters...,
),
endpoint.WithConsume([]mime.MIME{mime.JSON}),
endpoint.WithProduce([]mime.MIME{mime.JSON}),
endpoint.WithBody(body),
endpoint.WithTags(tag),
endpoint.WithSuccessfulReturns([]response.Response{
response.New(resp.Body, resp.Status, resp.Description),
}),
)
return endpoint
}
// addRoute registers a route with the specified HTTP method, endpoint, and handler function.
// It also applies any middlewares defined for the router to the handler and adds logging functionality.
// This function is responsible for associating a route with its handler and adding it to the HTTP server.
func (r *router) addRoute(method, endpoint string, salHandler SalHandlerFunc) {
if r.middlewares != nil {
for _, middleware := range r.middlewares {
salHandler = middleware(salHandler)
}
}
handler := func(w http.ResponseWriter, r *http.Request) {
c := ctxPool.Get().(*Ctx)
defer ctxPool.Put(c)
c.w = w
c.Request = r
salHandler(c)
}
pattern := method + " " + r.prefix + endpoint
http.HandleFunc(pattern, LoggerMiddleware(handler))
}