1 package middleware
2
3 import (
4 "context"
5 )
6
7
8
9
10 type DeserializeInput struct {
11 Request interface{}
12 }
13
14
15
16
17
18 type DeserializeOutput struct {
19 RawResponse interface{}
20 Result interface{}
21 }
22
23
24
25 type DeserializeHandler interface {
26 HandleDeserialize(ctx context.Context, in DeserializeInput) (
27 out DeserializeOutput, metadata Metadata, err error,
28 )
29 }
30
31
32
33
34 type DeserializeMiddleware interface {
35
36
37 ID() string
38
39
40
41
42 HandleDeserialize(ctx context.Context, in DeserializeInput, next DeserializeHandler) (
43 out DeserializeOutput, metadata Metadata, err error,
44 )
45 }
46
47
48
49 func DeserializeMiddlewareFunc(id string, fn func(context.Context, DeserializeInput, DeserializeHandler) (DeserializeOutput, Metadata, error)) DeserializeMiddleware {
50 return deserializeMiddlewareFunc{
51 id: id,
52 fn: fn,
53 }
54 }
55
56 type deserializeMiddlewareFunc struct {
57
58 id string
59
60
61 fn func(context.Context, DeserializeInput, DeserializeHandler) (
62 DeserializeOutput, Metadata, error,
63 )
64 }
65
66
67 func (s deserializeMiddlewareFunc) ID() string { return s.id }
68
69
70 func (s deserializeMiddlewareFunc) HandleDeserialize(ctx context.Context, in DeserializeInput, next DeserializeHandler) (
71 out DeserializeOutput, metadata Metadata, err error,
72 ) {
73 return s.fn(ctx, in, next)
74 }
75
76 var _ DeserializeMiddleware = (deserializeMiddlewareFunc{})
77
78
79
80 type DeserializeStep struct {
81 ids *orderedIDs
82 }
83
84
85
86 func NewDeserializeStep() *DeserializeStep {
87 return &DeserializeStep{
88 ids: newOrderedIDs(),
89 }
90 }
91
92 var _ Middleware = (*DeserializeStep)(nil)
93
94
95 func (s *DeserializeStep) ID() string {
96 return "Deserialize stack step"
97 }
98
99
100
101
102
103 func (s *DeserializeStep) HandleMiddleware(ctx context.Context, in interface{}, next Handler) (
104 out interface{}, metadata Metadata, err error,
105 ) {
106 order := s.ids.GetOrder()
107
108 var h DeserializeHandler = deserializeWrapHandler{Next: next}
109 for i := len(order) - 1; i >= 0; i-- {
110 h = decoratedDeserializeHandler{
111 Next: h,
112 With: order[i].(DeserializeMiddleware),
113 }
114 }
115
116 sIn := DeserializeInput{
117 Request: in,
118 }
119
120 res, metadata, err := h.HandleDeserialize(ctx, sIn)
121 return res.Result, metadata, err
122 }
123
124
125 func (s *DeserializeStep) Get(id string) (DeserializeMiddleware, bool) {
126 get, ok := s.ids.Get(id)
127 if !ok {
128 return nil, false
129 }
130 return get.(DeserializeMiddleware), ok
131 }
132
133
134
135 func (s *DeserializeStep) Add(m DeserializeMiddleware, pos RelativePosition) error {
136 return s.ids.Add(m, pos)
137 }
138
139
140
141
142 func (s *DeserializeStep) Insert(m DeserializeMiddleware, relativeTo string, pos RelativePosition) error {
143 return s.ids.Insert(m, relativeTo, pos)
144 }
145
146
147
148
149 func (s *DeserializeStep) Swap(id string, m DeserializeMiddleware) (DeserializeMiddleware, error) {
150 removed, err := s.ids.Swap(id, m)
151 if err != nil {
152 return nil, err
153 }
154
155 return removed.(DeserializeMiddleware), nil
156 }
157
158
159
160 func (s *DeserializeStep) Remove(id string) (DeserializeMiddleware, error) {
161 removed, err := s.ids.Remove(id)
162 if err != nil {
163 return nil, err
164 }
165
166 return removed.(DeserializeMiddleware), nil
167 }
168
169
170 func (s *DeserializeStep) List() []string {
171 return s.ids.List()
172 }
173
174
175 func (s *DeserializeStep) Clear() {
176 s.ids.Clear()
177 }
178
179 type deserializeWrapHandler struct {
180 Next Handler
181 }
182
183 var _ DeserializeHandler = (*deserializeWrapHandler)(nil)
184
185
186
187 func (w deserializeWrapHandler) HandleDeserialize(ctx context.Context, in DeserializeInput) (
188 out DeserializeOutput, metadata Metadata, err error,
189 ) {
190 resp, metadata, err := w.Next.Handle(ctx, in.Request)
191 return DeserializeOutput{
192 RawResponse: resp,
193 }, metadata, err
194 }
195
196 type decoratedDeserializeHandler struct {
197 Next DeserializeHandler
198 With DeserializeMiddleware
199 }
200
201 var _ DeserializeHandler = (*decoratedDeserializeHandler)(nil)
202
203 func (h decoratedDeserializeHandler) HandleDeserialize(ctx context.Context, in DeserializeInput) (
204 out DeserializeOutput, metadata Metadata, err error,
205 ) {
206 return h.With.HandleDeserialize(ctx, in, h.Next)
207 }
208
209
210 type DeserializeHandlerFunc func(context.Context, DeserializeInput) (DeserializeOutput, Metadata, error)
211
212
213 func (d DeserializeHandlerFunc) HandleDeserialize(ctx context.Context, in DeserializeInput) (DeserializeOutput, Metadata, error) {
214 return d(ctx, in)
215 }
216
217 var _ DeserializeHandler = DeserializeHandlerFunc(nil)
218
View as plain text