rama_core/layer/
mod.rs

1//! Layer type and utilities.
2//!
3//! Layers are the abstraction of middleware in Rama.
4//!
5//! Direct copy of [tower-layer](https://docs.rs/tower-layer/0.3.0/tower_layer/trait.Layer.html).
6
7/// A layer that produces a Layered service (middleware(inner service)).
8pub trait Layer<S>: Sized {
9    /// The service produced by the layer.
10    type Service;
11
12    /// Wrap the given service with the middleware, returning a new service.
13    fn layer(&self, inner: S) -> Self::Service;
14
15    /// Same as `layer` but consuming self after the service was created.
16    ///
17    /// This is useful in case you no longer need the Layer after the service
18    /// is created. By default this calls `layer` but if your `Layer` impl
19    /// requires cloning you can impl this method as well to avoid the cloning
20    /// for the cases where you no longer need the data in the `Layer` after
21    /// service ceation.
22    fn into_layer(self, inner: S) -> Self::Service {
23        self.layer(inner)
24    }
25}
26
27impl<T, S> Layer<S> for &T
28where
29    T: Layer<S>,
30{
31    type Service = T::Service;
32
33    fn layer(&self, inner: S) -> Self::Service {
34        (**self).layer(inner)
35    }
36
37    fn into_layer(self, inner: S) -> Self::Service {
38        (*self).layer(inner)
39    }
40}
41
42impl<L, S> Layer<S> for Option<L>
43where
44    L: Layer<S>,
45{
46    type Service = crate::combinators::Either<L::Service, S>;
47
48    fn layer(&self, inner: S) -> Self::Service {
49        match self {
50            Some(layer) => crate::combinators::Either::A(layer.layer(inner)),
51            None => crate::combinators::Either::B(inner),
52        }
53    }
54
55    fn into_layer(self, inner: S) -> Self::Service {
56        match self {
57            Some(layer) => crate::combinators::Either::A(layer.into_layer(inner)),
58            None => crate::combinators::Either::B(inner),
59        }
60    }
61}
62
63impl<S> Layer<S> for () {
64    type Service = S;
65
66    fn layer(&self, service: S) -> Self::Service {
67        service
68    }
69}
70
71impl<S, L1> Layer<S> for (L1,)
72where
73    L1: Layer<S>,
74{
75    type Service = L1::Service;
76
77    fn layer(&self, service: S) -> Self::Service {
78        let (l1,) = self;
79        l1.layer(service)
80    }
81
82    fn into_layer(self, service: S) -> Self::Service {
83        let (l1,) = self;
84        l1.into_layer(service)
85    }
86}
87
88impl<S, L1, L2> Layer<S> for (L1, L2)
89where
90    L1: Layer<L2::Service>,
91    L2: Layer<S>,
92{
93    type Service = L1::Service;
94
95    fn layer(&self, service: S) -> Self::Service {
96        let (l1, l2) = self;
97        l1.layer(l2.layer(service))
98    }
99
100    fn into_layer(self, service: S) -> Self::Service {
101        let (l1, l2) = self;
102        l1.into_layer(l2.into_layer(service))
103    }
104}
105
106impl<S, L1, L2, L3> Layer<S> for (L1, L2, L3)
107where
108    L1: Layer<L2::Service>,
109    L2: Layer<L3::Service>,
110    L3: Layer<S>,
111{
112    type Service = L1::Service;
113
114    fn layer(&self, service: S) -> Self::Service {
115        let (l1, l2, l3) = self;
116        l1.layer((l2, l3).layer(service))
117    }
118
119    fn into_layer(self, service: S) -> Self::Service {
120        let (l1, l2, l3) = self;
121        l1.into_layer((l2, l3).into_layer(service))
122    }
123}
124
125impl<S, L1, L2, L3, L4> Layer<S> for (L1, L2, L3, L4)
126where
127    L1: Layer<L2::Service>,
128    L2: Layer<L3::Service>,
129    L3: Layer<L4::Service>,
130    L4: Layer<S>,
131{
132    type Service = L1::Service;
133
134    fn layer(&self, service: S) -> Self::Service {
135        let (l1, l2, l3, l4) = self;
136        l1.layer((l2, l3, l4).layer(service))
137    }
138
139    fn into_layer(self, service: S) -> Self::Service {
140        let (l1, l2, l3, l4) = self;
141        l1.into_layer((l2, l3, l4).into_layer(service))
142    }
143}
144
145impl<S, L1, L2, L3, L4, L5> Layer<S> for (L1, L2, L3, L4, L5)
146where
147    L1: Layer<L2::Service>,
148    L2: Layer<L3::Service>,
149    L3: Layer<L4::Service>,
150    L4: Layer<L5::Service>,
151    L5: Layer<S>,
152{
153    type Service = L1::Service;
154
155    fn layer(&self, service: S) -> Self::Service {
156        let (l1, l2, l3, l4, l5) = self;
157        l1.layer((l2, l3, l4, l5).layer(service))
158    }
159
160    fn into_layer(self, service: S) -> Self::Service {
161        let (l1, l2, l3, l4, l5) = self;
162        l1.into_layer((l2, l3, l4, l5).into_layer(service))
163    }
164}
165
166impl<S, L1, L2, L3, L4, L5, L6> Layer<S> for (L1, L2, L3, L4, L5, L6)
167where
168    L1: Layer<L2::Service>,
169    L2: Layer<L3::Service>,
170    L3: Layer<L4::Service>,
171    L4: Layer<L5::Service>,
172    L5: Layer<L6::Service>,
173    L6: Layer<S>,
174{
175    type Service = L1::Service;
176
177    fn layer(&self, service: S) -> Self::Service {
178        let (l1, l2, l3, l4, l5, l6) = self;
179        l1.layer((l2, l3, l4, l5, l6).layer(service))
180    }
181
182    fn into_layer(self, service: S) -> Self::Service {
183        let (l1, l2, l3, l4, l5, l6) = self;
184        l1.into_layer((l2, l3, l4, l5, l6).into_layer(service))
185    }
186}
187
188impl<S, L1, L2, L3, L4, L5, L6, L7> Layer<S> for (L1, L2, L3, L4, L5, L6, L7)
189where
190    L1: Layer<L2::Service>,
191    L2: Layer<L3::Service>,
192    L3: Layer<L4::Service>,
193    L4: Layer<L5::Service>,
194    L5: Layer<L6::Service>,
195    L6: Layer<L7::Service>,
196    L7: Layer<S>,
197{
198    type Service = L1::Service;
199
200    fn layer(&self, service: S) -> Self::Service {
201        let (l1, l2, l3, l4, l5, l6, l7) = self;
202        l1.layer((l2, l3, l4, l5, l6, l7).layer(service))
203    }
204
205    fn into_layer(self, service: S) -> Self::Service {
206        let (l1, l2, l3, l4, l5, l6, l7) = self;
207        l1.into_layer((l2, l3, l4, l5, l6, l7).into_layer(service))
208    }
209}
210
211impl<S, L1, L2, L3, L4, L5, L6, L7, L8> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8)
212where
213    L1: Layer<L2::Service>,
214    L2: Layer<L3::Service>,
215    L3: Layer<L4::Service>,
216    L4: Layer<L5::Service>,
217    L5: Layer<L6::Service>,
218    L6: Layer<L7::Service>,
219    L7: Layer<L8::Service>,
220    L8: Layer<S>,
221{
222    type Service = L1::Service;
223
224    fn layer(&self, service: S) -> Self::Service {
225        let (l1, l2, l3, l4, l5, l6, l7, l8) = self;
226        l1.layer((l2, l3, l4, l5, l6, l7, l8).layer(service))
227    }
228
229    fn into_layer(self, service: S) -> Self::Service {
230        let (l1, l2, l3, l4, l5, l6, l7, l8) = self;
231        l1.into_layer((l2, l3, l4, l5, l6, l7, l8).into_layer(service))
232    }
233}
234
235impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8, L9)
236where
237    L1: Layer<L2::Service>,
238    L2: Layer<L3::Service>,
239    L3: Layer<L4::Service>,
240    L4: Layer<L5::Service>,
241    L5: Layer<L6::Service>,
242    L6: Layer<L7::Service>,
243    L7: Layer<L8::Service>,
244    L8: Layer<L9::Service>,
245    L9: Layer<S>,
246{
247    type Service = L1::Service;
248
249    fn layer(&self, service: S) -> Self::Service {
250        let (l1, l2, l3, l4, l5, l6, l7, l8, l9) = self;
251        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9).layer(service))
252    }
253
254    fn into_layer(self, service: S) -> Self::Service {
255        let (l1, l2, l3, l4, l5, l6, l7, l8, l9) = self;
256        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9).into_layer(service))
257    }
258}
259
260impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10> Layer<S>
261    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10)
262where
263    L1: Layer<L2::Service>,
264    L2: Layer<L3::Service>,
265    L3: Layer<L4::Service>,
266    L4: Layer<L5::Service>,
267    L5: Layer<L6::Service>,
268    L6: Layer<L7::Service>,
269    L7: Layer<L8::Service>,
270    L8: Layer<L9::Service>,
271    L9: Layer<L10::Service>,
272    L10: Layer<S>,
273{
274    type Service = L1::Service;
275
276    fn layer(&self, service: S) -> Self::Service {
277        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10) = self;
278        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10).layer(service))
279    }
280
281    fn into_layer(self, service: S) -> Self::Service {
282        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10) = self;
283        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10).into_layer(service))
284    }
285}
286
287impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11> Layer<S>
288    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11)
289where
290    L1: Layer<L2::Service>,
291    L2: Layer<L3::Service>,
292    L3: Layer<L4::Service>,
293    L4: Layer<L5::Service>,
294    L5: Layer<L6::Service>,
295    L6: Layer<L7::Service>,
296    L7: Layer<L8::Service>,
297    L8: Layer<L9::Service>,
298    L9: Layer<L10::Service>,
299    L10: Layer<L11::Service>,
300    L11: Layer<S>,
301{
302    type Service = L1::Service;
303
304    fn layer(&self, service: S) -> Self::Service {
305        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11) = self;
306        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11).layer(service))
307    }
308
309    fn into_layer(self, service: S) -> Self::Service {
310        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11) = self;
311        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11).into_layer(service))
312    }
313}
314
315impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12> Layer<S>
316    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12)
317where
318    L1: Layer<L2::Service>,
319    L2: Layer<L3::Service>,
320    L3: Layer<L4::Service>,
321    L4: Layer<L5::Service>,
322    L5: Layer<L6::Service>,
323    L6: Layer<L7::Service>,
324    L7: Layer<L8::Service>,
325    L8: Layer<L9::Service>,
326    L9: Layer<L10::Service>,
327    L10: Layer<L11::Service>,
328    L11: Layer<L12::Service>,
329    L12: Layer<S>,
330{
331    type Service = L1::Service;
332
333    fn layer(&self, service: S) -> Self::Service {
334        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12) = self;
335        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12).layer(service))
336    }
337
338    fn into_layer(self, service: S) -> Self::Service {
339        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12) = self;
340        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12).into_layer(service))
341    }
342}
343
344impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13> Layer<S>
345    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13)
346where
347    L1: Layer<L2::Service>,
348    L2: Layer<L3::Service>,
349    L3: Layer<L4::Service>,
350    L4: Layer<L5::Service>,
351    L5: Layer<L6::Service>,
352    L6: Layer<L7::Service>,
353    L7: Layer<L8::Service>,
354    L8: Layer<L9::Service>,
355    L9: Layer<L10::Service>,
356    L10: Layer<L11::Service>,
357    L11: Layer<L12::Service>,
358    L12: Layer<L13::Service>,
359    L13: Layer<S>,
360{
361    type Service = L1::Service;
362
363    fn layer(&self, service: S) -> Self::Service {
364        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13) = self;
365        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13).layer(service))
366    }
367
368    fn into_layer(self, service: S) -> Self::Service {
369        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13) = self;
370        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13).into_layer(service))
371    }
372}
373
374impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14> Layer<S>
375    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14)
376where
377    L1: Layer<L2::Service>,
378    L2: Layer<L3::Service>,
379    L3: Layer<L4::Service>,
380    L4: Layer<L5::Service>,
381    L5: Layer<L6::Service>,
382    L6: Layer<L7::Service>,
383    L7: Layer<L8::Service>,
384    L8: Layer<L9::Service>,
385    L9: Layer<L10::Service>,
386    L10: Layer<L11::Service>,
387    L11: Layer<L12::Service>,
388    L12: Layer<L13::Service>,
389    L13: Layer<L14::Service>,
390    L14: Layer<S>,
391{
392    type Service = L1::Service;
393
394    fn layer(&self, service: S) -> Self::Service {
395        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14) = self;
396        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14).layer(service))
397    }
398
399    fn into_layer(self, service: S) -> Self::Service {
400        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14) = self;
401        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14).into_layer(service))
402    }
403}
404
405#[rustfmt::skip]
406impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15> Layer<S>
407    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15)
408where
409    L1: Layer<L2::Service>,
410    L2: Layer<L3::Service>,
411    L3: Layer<L4::Service>,
412    L4: Layer<L5::Service>,
413    L5: Layer<L6::Service>,
414    L6: Layer<L7::Service>,
415    L7: Layer<L8::Service>,
416    L8: Layer<L9::Service>,
417    L9: Layer<L10::Service>,
418    L10: Layer<L11::Service>,
419    L11: Layer<L12::Service>,
420    L12: Layer<L13::Service>,
421    L13: Layer<L14::Service>,
422    L14: Layer<L15::Service>,
423    L15: Layer<S>,
424{
425    type Service = L1::Service;
426
427    fn layer(&self, service: S) -> Self::Service {
428        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15) = self;
429        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15).layer(service))
430    }
431
432    fn into_layer(self, service: S) -> Self::Service {
433        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15) = self;
434        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15).into_layer(service))
435    }
436}
437
438#[rustfmt::skip]
439impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16> Layer<S>
440    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16)
441where
442    L1: Layer<L2::Service>,
443    L2: Layer<L3::Service>,
444    L3: Layer<L4::Service>,
445    L4: Layer<L5::Service>,
446    L5: Layer<L6::Service>,
447    L6: Layer<L7::Service>,
448    L7: Layer<L8::Service>,
449    L8: Layer<L9::Service>,
450    L9: Layer<L10::Service>,
451    L10: Layer<L11::Service>,
452    L11: Layer<L12::Service>,
453    L12: Layer<L13::Service>,
454    L13: Layer<L14::Service>,
455    L14: Layer<L15::Service>,
456    L15: Layer<L16::Service>,
457    L16: Layer<S>,
458{
459    type Service = L1::Service;
460
461    fn layer(&self, service: S) -> Self::Service {
462        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16) = self;
463        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16).layer(service))
464    }
465
466    fn into_layer(self, service: S) -> Self::Service {
467        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16) = self;
468        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16).into_layer(service))
469    }
470}
471
472#[rustfmt::skip]
473impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17> Layer<S>
474    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17)
475where
476    L1: Layer<L2::Service>,
477    L2: Layer<L3::Service>,
478    L3: Layer<L4::Service>,
479    L4: Layer<L5::Service>,
480    L5: Layer<L6::Service>,
481    L6: Layer<L7::Service>,
482    L7: Layer<L8::Service>,
483    L8: Layer<L9::Service>,
484    L9: Layer<L10::Service>,
485    L10: Layer<L11::Service>,
486    L11: Layer<L12::Service>,
487    L12: Layer<L13::Service>,
488    L13: Layer<L14::Service>,
489    L14: Layer<L15::Service>,
490    L15: Layer<L16::Service>,
491    L16: Layer<L17::Service>,
492    L17: Layer<S>,
493{
494    type Service = L1::Service;
495
496    fn layer(&self, service: S) -> Self::Service {
497        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17) = self;
498        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17).layer(service))
499    }
500
501    fn into_layer(self, service: S) -> Self::Service {
502        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17) = self;
503        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17).into_layer(service))
504    }
505}
506
507#[rustfmt::skip]
508impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18> Layer<S>
509    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18)
510where
511    L1: Layer<L2::Service>,
512    L2: Layer<L3::Service>,
513    L3: Layer<L4::Service>,
514    L4: Layer<L5::Service>,
515    L5: Layer<L6::Service>,
516    L6: Layer<L7::Service>,
517    L7: Layer<L8::Service>,
518    L8: Layer<L9::Service>,
519    L9: Layer<L10::Service>,
520    L10: Layer<L11::Service>,
521    L11: Layer<L12::Service>,
522    L12: Layer<L13::Service>,
523    L13: Layer<L14::Service>,
524    L14: Layer<L15::Service>,
525    L15: Layer<L16::Service>,
526    L16: Layer<L17::Service>,
527    L17: Layer<L18::Service>,
528    L18: Layer<S>,
529{
530    type Service = L1::Service;
531
532    fn layer(&self, service: S) -> Self::Service {
533        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18) = self;
534        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18).layer(service))
535    }
536
537    fn into_layer(self, service: S) -> Self::Service {
538        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18) = self;
539        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18).into_layer(service))
540    }
541}
542
543#[rustfmt::skip]
544impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19> Layer<S>
545    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19)
546where
547    L1: Layer<L2::Service>,
548    L2: Layer<L3::Service>,
549    L3: Layer<L4::Service>,
550    L4: Layer<L5::Service>,
551    L5: Layer<L6::Service>,
552    L6: Layer<L7::Service>,
553    L7: Layer<L8::Service>,
554    L8: Layer<L9::Service>,
555    L9: Layer<L10::Service>,
556    L10: Layer<L11::Service>,
557    L11: Layer<L12::Service>,
558    L12: Layer<L13::Service>,
559    L13: Layer<L14::Service>,
560    L14: Layer<L15::Service>,
561    L15: Layer<L16::Service>,
562    L16: Layer<L17::Service>,
563    L17: Layer<L18::Service>,
564    L18: Layer<L19::Service>,
565    L19: Layer<S>,
566{
567    type Service = L1::Service;
568
569    fn layer(&self, service: S) -> Self::Service {
570        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19) = self;
571        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19).layer(service))
572    }
573
574    fn into_layer(self, service: S) -> Self::Service {
575        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19) = self;
576        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19).into_layer(service))
577    }
578}
579
580#[rustfmt::skip]
581impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20> Layer<S>
582    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20)
583where
584    L1: Layer<L2::Service>,
585    L2: Layer<L3::Service>,
586    L3: Layer<L4::Service>,
587    L4: Layer<L5::Service>,
588    L5: Layer<L6::Service>,
589    L6: Layer<L7::Service>,
590    L7: Layer<L8::Service>,
591    L8: Layer<L9::Service>,
592    L9: Layer<L10::Service>,
593    L10: Layer<L11::Service>,
594    L11: Layer<L12::Service>,
595    L12: Layer<L13::Service>,
596    L13: Layer<L14::Service>,
597    L14: Layer<L15::Service>,
598    L15: Layer<L16::Service>,
599    L16: Layer<L17::Service>,
600    L17: Layer<L18::Service>,
601    L18: Layer<L19::Service>,
602    L19: Layer<L20::Service>,
603    L20: Layer<S>,
604{
605    type Service = L1::Service;
606
607    fn layer(&self, service: S) -> Self::Service {
608        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20) = self;
609        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20).layer(service))
610    }
611
612    fn into_layer(self, service: S) -> Self::Service {
613        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20) = self;
614        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20).into_layer(service))
615    }
616}
617
618#[rustfmt::skip]
619impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21> Layer<S>
620    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21)
621where
622    L1: Layer<L2::Service>,
623    L2: Layer<L3::Service>,
624    L3: Layer<L4::Service>,
625    L4: Layer<L5::Service>,
626    L5: Layer<L6::Service>,
627    L6: Layer<L7::Service>,
628    L7: Layer<L8::Service>,
629    L8: Layer<L9::Service>,
630    L9: Layer<L10::Service>,
631    L10: Layer<L11::Service>,
632    L11: Layer<L12::Service>,
633    L12: Layer<L13::Service>,
634    L13: Layer<L14::Service>,
635    L14: Layer<L15::Service>,
636    L15: Layer<L16::Service>,
637    L16: Layer<L17::Service>,
638    L17: Layer<L18::Service>,
639    L18: Layer<L19::Service>,
640    L19: Layer<L20::Service>,
641    L20: Layer<L21::Service>,
642    L21: Layer<S>,
643{
644    type Service = L1::Service;
645
646    fn layer(&self, service: S) -> Self::Service {
647        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21) = self;
648        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21).layer(service))
649    }
650
651    fn into_layer(self, service: S) -> Self::Service {
652        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21) = self;
653        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21).into_layer(service))
654    }
655}
656
657#[rustfmt::skip]
658impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22> Layer<S>
659    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22)
660where
661    L1: Layer<L2::Service>,
662    L2: Layer<L3::Service>,
663    L3: Layer<L4::Service>,
664    L4: Layer<L5::Service>,
665    L5: Layer<L6::Service>,
666    L6: Layer<L7::Service>,
667    L7: Layer<L8::Service>,
668    L8: Layer<L9::Service>,
669    L9: Layer<L10::Service>,
670    L10: Layer<L11::Service>,
671    L11: Layer<L12::Service>,
672    L12: Layer<L13::Service>,
673    L13: Layer<L14::Service>,
674    L14: Layer<L15::Service>,
675    L15: Layer<L16::Service>,
676    L16: Layer<L17::Service>,
677    L17: Layer<L18::Service>,
678    L18: Layer<L19::Service>,
679    L19: Layer<L20::Service>,
680    L20: Layer<L21::Service>,
681    L21: Layer<L22::Service>,
682    L22: Layer<S>,
683{
684    type Service = L1::Service;
685
686    fn layer(&self, service: S) -> Self::Service {
687        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22) = self;
688        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22).layer(service))
689    }
690
691    fn into_layer(self, service: S) -> Self::Service {
692        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22) = self;
693        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22).into_layer(service))
694    }
695}
696
697#[rustfmt::skip]
698impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22, L23> Layer<S>
699    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22, L23)
700where
701    L1: Layer<L2::Service>,
702    L2: Layer<L3::Service>,
703    L3: Layer<L4::Service>,
704    L4: Layer<L5::Service>,
705    L5: Layer<L6::Service>,
706    L6: Layer<L7::Service>,
707    L7: Layer<L8::Service>,
708    L8: Layer<L9::Service>,
709    L9: Layer<L10::Service>,
710    L10: Layer<L11::Service>,
711    L11: Layer<L12::Service>,
712    L12: Layer<L13::Service>,
713    L13: Layer<L14::Service>,
714    L14: Layer<L15::Service>,
715    L15: Layer<L16::Service>,
716    L16: Layer<L17::Service>,
717    L17: Layer<L18::Service>,
718    L18: Layer<L19::Service>,
719    L19: Layer<L20::Service>,
720    L20: Layer<L21::Service>,
721    L21: Layer<L22::Service>,
722    L22: Layer<L23::Service>,
723    L23: Layer<S>,
724{
725    type Service = L1::Service;
726
727    fn layer(&self, service: S) -> Self::Service {
728        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23) = self;
729        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23).layer(service))
730    }
731
732    fn into_layer(self, service: S) -> Self::Service {
733        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23) = self;
734        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23).into_layer(service))
735    }
736}
737
738#[rustfmt::skip]
739impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22, L23, L24> Layer<S>
740    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22, L23, L24)
741where
742    L1: Layer<L2::Service>,
743    L2: Layer<L3::Service>,
744    L3: Layer<L4::Service>,
745    L4: Layer<L5::Service>,
746    L5: Layer<L6::Service>,
747    L6: Layer<L7::Service>,
748    L7: Layer<L8::Service>,
749    L8: Layer<L9::Service>,
750    L9: Layer<L10::Service>,
751    L10: Layer<L11::Service>,
752    L11: Layer<L12::Service>,
753    L12: Layer<L13::Service>,
754    L13: Layer<L14::Service>,
755    L14: Layer<L15::Service>,
756    L15: Layer<L16::Service>,
757    L16: Layer<L17::Service>,
758    L17: Layer<L18::Service>,
759    L18: Layer<L19::Service>,
760    L19: Layer<L20::Service>,
761    L20: Layer<L21::Service>,
762    L21: Layer<L22::Service>,
763    L22: Layer<L23::Service>,
764    L23: Layer<L24::Service>,
765    L24: Layer<S>,
766{
767    type Service = L1::Service;
768
769    fn layer(&self, service: S) -> Self::Service {
770        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24) = self;
771        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24).layer(service))
772    }
773
774    fn into_layer(self, service: S) -> Self::Service {
775        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24) = self;
776        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24).into_layer(service))
777    }
778}
779
780#[rustfmt::skip]
781impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22, L23, L24, L25> Layer<S>
782    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22, L23, L24, L25)
783where
784    L1: Layer<L2::Service>,
785    L2: Layer<L3::Service>,
786    L3: Layer<L4::Service>,
787    L4: Layer<L5::Service>,
788    L5: Layer<L6::Service>,
789    L6: Layer<L7::Service>,
790    L7: Layer<L8::Service>,
791    L8: Layer<L9::Service>,
792    L9: Layer<L10::Service>,
793    L10: Layer<L11::Service>,
794    L11: Layer<L12::Service>,
795    L12: Layer<L13::Service>,
796    L13: Layer<L14::Service>,
797    L14: Layer<L15::Service>,
798    L15: Layer<L16::Service>,
799    L16: Layer<L17::Service>,
800    L17: Layer<L18::Service>,
801    L18: Layer<L19::Service>,
802    L19: Layer<L20::Service>,
803    L20: Layer<L21::Service>,
804    L21: Layer<L22::Service>,
805    L22: Layer<L23::Service>,
806    L23: Layer<L24::Service>,
807    L24: Layer<L25::Service>,
808    L25: Layer<S>,
809{
810    type Service = L1::Service;
811
812    fn layer(&self, service: S) -> Self::Service {
813        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, l25) = self;
814        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, l25).layer(service))
815    }
816
817    fn into_layer(self, service: S) -> Self::Service {
818        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, l25) = self;
819        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, l25).into_layer(service))
820    }
821}
822
823mod into_error;
824#[doc(inline)]
825pub use into_error::{LayerErrorFn, LayerErrorStatic, MakeLayerError};
826
827mod hijack;
828#[doc(inline)]
829pub use hijack::{HijackLayer, HijackService};
830
831mod map_state;
832#[doc(inline)]
833pub use map_state::{MapState, MapStateLayer};
834
835mod layer_fn;
836#[doc(inline)]
837pub use layer_fn::{LayerFn, layer_fn};
838
839mod map_request;
840#[doc(inline)]
841pub use map_request::{MapRequest, MapRequestLayer};
842
843mod map_response;
844#[doc(inline)]
845pub use map_response::{MapResponse, MapResponseLayer};
846
847mod map_err;
848#[doc(inline)]
849pub use map_err::{MapErr, MapErrLayer};
850
851mod consume_err;
852#[doc(inline)]
853pub use consume_err::{ConsumeErr, ConsumeErrLayer};
854
855mod trace_err;
856#[doc(inline)]
857pub use trace_err::{TraceErr, TraceErrLayer};
858
859mod map_result;
860#[doc(inline)]
861pub use map_result::{MapResult, MapResultLayer};
862
863pub mod timeout;
864pub use timeout::{Timeout, TimeoutLayer};
865
866pub mod limit;
867pub use limit::{Limit, LimitLayer};
868
869pub mod add_extension;
870pub use add_extension::{AddExtension, AddExtensionLayer};
871
872pub mod get_extension;
873pub use get_extension::{GetExtension, GetExtensionLayer};
874
875macro_rules! impl_layer_either {
876    ($id:ident, $($param:ident),+ $(,)?) => {
877        impl<$($param),+, S> Layer<S> for crate::combinators::$id<$($param),+>
878        where
879            $($param: Layer<S>),+,
880        {
881            type Service = crate::combinators::$id<$($param::Service),+>;
882
883            fn layer(&self, inner: S) -> Self::Service {
884                match self {
885                    $(
886                        crate::combinators::$id::$param(layer) => crate::combinators::$id::$param(layer.layer(inner)),
887                    )+
888                }
889            }
890
891            fn into_layer(self, inner: S) -> Self::Service {
892                match self {
893                    $(
894                        crate::combinators::$id::$param(layer) => crate::combinators::$id::$param(layer.into_layer(inner)),
895                    )+
896                }
897            }
898        }
899    };
900}
901
902crate::combinators::impl_either!(impl_layer_either);