-
Notifications
You must be signed in to change notification settings - Fork 0
/
layer.go
138 lines (110 loc) · 2.69 KB
/
layer.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
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
127
128
129
130
131
132
133
134
135
136
137
138
package axum
import (
"net/http"
)
type Layer interface {
Layer(Service) Service
}
type LayerService interface {
Handle(*http.Request, Service) ResponsePacker
}
type Layer2Func func(*Request, Service) ResponsePacker
func (fn Layer2Func) Handle(r *http.Request, srv Service) ResponsePacker {
return fn(&Request{Value: r}, srv)
}
type Layer3Func[T1 RequestExtractor] func(*T1, *Request, Service) (ResponsePacker, error)
func (fn Layer3Func[T1]) Handle(r *http.Request, srv Service) (ResponsePacker, error) {
var ext1 T1
t1, err := ext1.Extract(r)
if err != nil {
return nil, err
}
s1 := t1.(T1)
return fn(&s1, &Request{Value: r}, srv)
}
func LayerArgs3Func[T1 RequestExtractor](fn Layer3Func[T1]) Layer3Func[T1] {
return fn
}
type Layer4Func[T1, T2 RequestExtractor] func(*T1, *T2, *Request, Service) (ResponsePacker, error)
func (fn Layer4Func[T1, T2]) Handle(r *http.Request, srv Service) (ResponsePacker, error) {
var ext1 T1
t1, err := ext1.Extract(r)
if err != nil {
return nil, err
}
s1 := t1.(T1)
var ext2 T2
t2, err := ext2.Extract(r)
if err != nil {
return nil, err
}
s2 := t2.(T2)
return fn(&s1, &s2, &Request{Value: r}, srv)
}
type Layer5Func[T1, T2, T3 RequestExtractor] func(*T1, *T2, *T3, *Request, Service) (ResponsePacker, error)
func (fn Layer5Func[T1, T2, T3]) Handle(r *http.Request, srv Service) (ResponsePacker, error) {
var ext1 T1
t1, err := ext1.Extract(r)
if err != nil {
return nil, err
}
s1 := t1.(T1)
var ext2 T2
t2, err := ext2.Extract(r)
if err != nil {
return nil, err
}
s2 := t2.(T2)
var ext3 T3
t3, err := ext3.Extract(r)
if err != nil {
return nil, err
}
s3 := t3.(T3)
return fn(&s1, &s2, &s3, &Request{Value: r}, srv)
}
type Layer6Func[T1, T2, T3, T4 RequestExtractor] func(*T1, *T2, *T3, *T4, *Request, Service) (ResponsePacker, error)
func (fn Layer6Func[T1, T2, T3, T4]) Handle(r *http.Request, srv Service) (ResponsePacker, error) {
var ext1 T1
t1, err := ext1.Extract(r)
if err != nil {
return nil, err
}
s1 := t1.(T1)
var ext2 T2
t2, err := ext2.Extract(r)
if err != nil {
return nil, err
}
s2 := t2.(T2)
var ext3 T3
t3, err := ext3.Extract(r)
if err != nil {
return nil, err
}
s3 := t3.(T3)
var ext4 T4
t4, err := ext4.Extract(r)
if err != nil {
return nil, err
}
s4 := t4.(T4)
return fn(&s1, &s2, &s3, &s4, &Request{Value: r}, srv)
}
type service struct {
inner Service
f LayerService
}
func (s *service) Handle(r *http.Request) ResponsePacker {
return s.f.Handle(r, s.inner)
}
func (s *service) Layer(inner Service) Service {
return ServiceFunc(func(r *http.Request) ResponsePacker {
return s.f.Handle(r, inner)
})
}
func NewService(f LayerService) *service {
return &service{
f: f,
}
}