-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathapp.go
More file actions
126 lines (102 loc) · 2.88 KB
/
app.go
File metadata and controls
126 lines (102 loc) · 2.88 KB
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package simplapi
import (
"net/http"
"github.com/go-simpl/simplapi/pkg/framework"
"github.com/go-simpl/simplapi/pkg/handler"
"github.com/go-simpl/simplapi/pkg/spec"
)
type App struct {
framework framework.Framework
spec *spec.Spec
endpoints []*Endpoint
}
type AppConfig struct {
framework framework.Framework
spec *spec.Spec
}
type AppOption func(*AppConfig)
func WithCreateFramework(frameworkName string) AppOption {
return func(c *AppConfig) {
c.framework = framework.GetFramework(frameworkName)
}
}
func WithFramework(framework framework.Framework) AppOption {
return func(c *AppConfig) {
c.framework = framework
}
}
func WithAutoOpenAPISpec(basePkgName string) AppOption {
return func(c *AppConfig) {
c.spec = spec.New(basePkgName)
}
}
func New(opts ...AppOption) *App {
config := &AppConfig{}
for _, opt := range opts {
opt(config)
}
s := &App{
framework: config.framework,
spec: config.spec,
endpoints: []*Endpoint{},
}
if s.spec != nil {
addOpenAPIRoutes(s)
}
return s
}
func (s *App) GetApp() framework.Framework {
return s.framework
}
func (s *App) GET(path string, handlers ...interface{}) *Endpoint {
endpoint := newEndpoint(http.MethodGet, path, handlers...)
s.addEndpoint(endpoint)
return endpoint
}
func (s *App) POST(path string, handlers ...interface{}) *Endpoint {
endpoint := newEndpoint(http.MethodPost, path, handlers...)
s.addEndpoint(endpoint)
return endpoint
}
func (s *App) PUT(path string, handlers ...interface{}) *Endpoint {
endpoint := newEndpoint(http.MethodPut, path, handlers...)
s.addEndpoint(endpoint)
return endpoint
}
func (s *App) DELETE(path string, handlers ...interface{}) *Endpoint {
endpoint := newEndpoint(http.MethodDelete, path, handlers...)
s.addEndpoint(endpoint)
return endpoint
}
func (s *App) PATCH(path string, handlers ...interface{}) *Endpoint {
endpoint := newEndpoint(http.MethodPatch, path, handlers...)
s.addEndpoint(endpoint)
return endpoint
}
func (s *App) Sync() {
for _, e := range s.endpoints {
s.framework.Register(e.path, e.method, s.createHandler(e.handlers...))
if e.addToSpec && s.spec != nil {
s.spec.Register(s.framework.GetOpenAPICompatiblePathPattern(e.path), e.method, e.tags, e.operationId, e.summary, e.description, e.handlers...)
}
}
}
func (s *App) ListenAndServe(addr string) error {
// Actual registration of endpoints happen here
s.Sync()
return s.framework.ListenAndServe(addr)
}
func (s *App) addEndpoint(endpoint *Endpoint) {
s.endpoints = append(s.endpoints, endpoint)
}
func (s *App) createHandler(handlers ...interface{}) framework.FrameworkHandler {
// Reverse the handlers slice
for i, j := 0, len(handlers)-1; i < j; i, j = i+1, j-1 {
handlers[i], handlers[j] = handlers[j], handlers[i]
}
var nextHandler framework.FrameworkHandler = nil
for _, h := range handlers {
nextHandler = handler.WrapHandler(h, nextHandler)
}
return nextHandler
}