-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathroute.go
More file actions
117 lines (101 loc) · 2.93 KB
/
route.go
File metadata and controls
117 lines (101 loc) · 2.93 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
package openapirouter
import (
"fmt"
"github.com/getkin/kin-openapi/openapi3"
"github.com/labstack/echo/v5"
)
type FailureHandler func(c *echo.Context, err error) error
type OpenAPIRoute struct {
method string
path string
operation *openapi3.Operation
handlers []echo.HandlerFunc
middlewares []echo.MiddlewareFunc
failureHandlers []FailureHandler
}
func newOpenAPIRoute(method string, path string, operation *openapi3.Operation) *OpenAPIRoute {
return &OpenAPIRoute{
method: method,
path: path,
operation: operation,
}
}
func (route *OpenAPIRoute) AddHandler(handler echo.HandlerFunc, middleware ...echo.MiddlewareFunc) *OpenAPIRoute {
if route == nil {
panic(
"openapirouter: OpenAPIRoute.AddHandler called on nil route; " +
"get a route from RouterBuilder.GetRoute or RouterBuilder.AddRoute before adding handlers",
)
}
if handler == nil {
operationID := "(unknown)"
if route.operation != nil && route.operation.OperationID != "" {
operationID = route.operation.OperationID
}
panic(fmt.Sprintf(
"openapirouter: AddHandler(%q): handler cannot be nil for %s %s; "+
"pass a non-nil echo.HandlerFunc, or leave the route without handlers to return 501 Not Implemented",
operationID,
route.method,
route.path,
))
}
route.Use(middleware...)
route.handlers = append(route.handlers, handler)
return route
}
func (route *OpenAPIRoute) Handlers() []echo.HandlerFunc {
return append([]echo.HandlerFunc(nil), route.handlers...)
}
func (route *OpenAPIRoute) Use(middleware ...echo.MiddlewareFunc) *OpenAPIRoute {
for _, m := range middleware {
if m != nil {
route.middlewares = append(route.middlewares, m)
}
}
return route
}
func (route *OpenAPIRoute) Middlewares() []echo.MiddlewareFunc {
return append([]echo.MiddlewareFunc(nil), route.middlewares...)
}
func (route *OpenAPIRoute) AddFailureHandler(handler FailureHandler) *OpenAPIRoute {
if handler != nil {
route.failureHandlers = append(route.failureHandlers, handler)
}
return route
}
func (route *OpenAPIRoute) FailureHandlers() []FailureHandler {
return append([]FailureHandler(nil), route.failureHandlers...)
}
func (route *OpenAPIRoute) Operation() *openapi3.Operation {
return route.operation
}
func (route *OpenAPIRoute) Method() string {
return route.method
}
func (route *OpenAPIRoute) Path() string {
return route.path
}
func failureMiddleware(handlers []FailureHandler) echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c *echo.Context) error {
err := next(c)
if err == nil || len(handlers) == 0 {
return err
}
for _, handler := range handlers {
if handlerErr := handler(c, err); handlerErr != nil {
err = handlerErr
}
if responseCommitted(c) {
return nil
}
}
return err
}
}
}
func responseCommitted(c *echo.Context) bool {
response, ok := c.Response().(*echo.Response)
return ok && response.Committed
}