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> {
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
16impl<T, S> Layer<S> for &T
17where
18    T: ?Sized + Layer<S>,
19{
20    type Service = T::Service;
21
22    fn layer(&self, inner: S) -> Self::Service {
23        (**self).layer(inner)
24    }
25}
26
27impl<L, S> Layer<S> for Option<L>
28where
29    L: Layer<S>,
30{
31    type Service = crate::combinators::Either<L::Service, S>;
32
33    fn layer(&self, inner: S) -> Self::Service {
34        match self {
35            Some(layer) => crate::combinators::Either::A(layer.layer(inner)),
36            None => crate::combinators::Either::B(inner),
37        }
38    }
39}
40
41impl<S> Layer<S> for () {
42    type Service = S;
43
44    fn layer(&self, service: S) -> Self::Service {
45        service
46    }
47}
48
49impl<S, L1> Layer<S> for (L1,)
50where
51    L1: Layer<S>,
52{
53    type Service = L1::Service;
54
55    fn layer(&self, service: S) -> Self::Service {
56        let (l1,) = self;
57        l1.layer(service)
58    }
59}
60
61impl<S, L1, L2> Layer<S> for (L1, L2)
62where
63    L1: Layer<L2::Service>,
64    L2: Layer<S>,
65{
66    type Service = L1::Service;
67
68    fn layer(&self, service: S) -> Self::Service {
69        let (l1, l2) = self;
70        l1.layer(l2.layer(service))
71    }
72}
73
74impl<S, L1, L2, L3> Layer<S> for (L1, L2, L3)
75where
76    L1: Layer<L2::Service>,
77    L2: Layer<L3::Service>,
78    L3: Layer<S>,
79{
80    type Service = L1::Service;
81
82    fn layer(&self, service: S) -> Self::Service {
83        let (l1, l2, l3) = self;
84        l1.layer((l2, l3).layer(service))
85    }
86}
87
88impl<S, L1, L2, L3, L4> Layer<S> for (L1, L2, L3, L4)
89where
90    L1: Layer<L2::Service>,
91    L2: Layer<L3::Service>,
92    L3: Layer<L4::Service>,
93    L4: Layer<S>,
94{
95    type Service = L1::Service;
96
97    fn layer(&self, service: S) -> Self::Service {
98        let (l1, l2, l3, l4) = self;
99        l1.layer((l2, l3, l4).layer(service))
100    }
101}
102
103impl<S, L1, L2, L3, L4, L5> Layer<S> for (L1, L2, L3, L4, L5)
104where
105    L1: Layer<L2::Service>,
106    L2: Layer<L3::Service>,
107    L3: Layer<L4::Service>,
108    L4: Layer<L5::Service>,
109    L5: Layer<S>,
110{
111    type Service = L1::Service;
112
113    fn layer(&self, service: S) -> Self::Service {
114        let (l1, l2, l3, l4, l5) = self;
115        l1.layer((l2, l3, l4, l5).layer(service))
116    }
117}
118
119impl<S, L1, L2, L3, L4, L5, L6> Layer<S> for (L1, L2, L3, L4, L5, L6)
120where
121    L1: Layer<L2::Service>,
122    L2: Layer<L3::Service>,
123    L3: Layer<L4::Service>,
124    L4: Layer<L5::Service>,
125    L5: Layer<L6::Service>,
126    L6: Layer<S>,
127{
128    type Service = L1::Service;
129
130    fn layer(&self, service: S) -> Self::Service {
131        let (l1, l2, l3, l4, l5, l6) = self;
132        l1.layer((l2, l3, l4, l5, l6).layer(service))
133    }
134}
135
136impl<S, L1, L2, L3, L4, L5, L6, L7> Layer<S> for (L1, L2, L3, L4, L5, L6, L7)
137where
138    L1: Layer<L2::Service>,
139    L2: Layer<L3::Service>,
140    L3: Layer<L4::Service>,
141    L4: Layer<L5::Service>,
142    L5: Layer<L6::Service>,
143    L6: Layer<L7::Service>,
144    L7: Layer<S>,
145{
146    type Service = L1::Service;
147
148    fn layer(&self, service: S) -> Self::Service {
149        let (l1, l2, l3, l4, l5, l6, l7) = self;
150        l1.layer((l2, l3, l4, l5, l6, l7).layer(service))
151    }
152}
153
154impl<S, L1, L2, L3, L4, L5, L6, L7, L8> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8)
155where
156    L1: Layer<L2::Service>,
157    L2: Layer<L3::Service>,
158    L3: Layer<L4::Service>,
159    L4: Layer<L5::Service>,
160    L5: Layer<L6::Service>,
161    L6: Layer<L7::Service>,
162    L7: Layer<L8::Service>,
163    L8: Layer<S>,
164{
165    type Service = L1::Service;
166
167    fn layer(&self, service: S) -> Self::Service {
168        let (l1, l2, l3, l4, l5, l6, l7, l8) = self;
169        l1.layer((l2, l3, l4, l5, l6, l7, l8).layer(service))
170    }
171}
172
173impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8, L9)
174where
175    L1: Layer<L2::Service>,
176    L2: Layer<L3::Service>,
177    L3: Layer<L4::Service>,
178    L4: Layer<L5::Service>,
179    L5: Layer<L6::Service>,
180    L6: Layer<L7::Service>,
181    L7: Layer<L8::Service>,
182    L8: Layer<L9::Service>,
183    L9: Layer<S>,
184{
185    type Service = L1::Service;
186
187    fn layer(&self, service: S) -> Self::Service {
188        let (l1, l2, l3, l4, l5, l6, l7, l8, l9) = self;
189        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9).layer(service))
190    }
191}
192
193impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10> Layer<S>
194    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10)
195where
196    L1: Layer<L2::Service>,
197    L2: Layer<L3::Service>,
198    L3: Layer<L4::Service>,
199    L4: Layer<L5::Service>,
200    L5: Layer<L6::Service>,
201    L6: Layer<L7::Service>,
202    L7: Layer<L8::Service>,
203    L8: Layer<L9::Service>,
204    L9: Layer<L10::Service>,
205    L10: Layer<S>,
206{
207    type Service = L1::Service;
208
209    fn layer(&self, service: S) -> Self::Service {
210        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10) = self;
211        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10).layer(service))
212    }
213}
214
215impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11> Layer<S>
216    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11)
217where
218    L1: Layer<L2::Service>,
219    L2: Layer<L3::Service>,
220    L3: Layer<L4::Service>,
221    L4: Layer<L5::Service>,
222    L5: Layer<L6::Service>,
223    L6: Layer<L7::Service>,
224    L7: Layer<L8::Service>,
225    L8: Layer<L9::Service>,
226    L9: Layer<L10::Service>,
227    L10: Layer<L11::Service>,
228    L11: Layer<S>,
229{
230    type Service = L1::Service;
231
232    fn layer(&self, service: S) -> Self::Service {
233        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11) = self;
234        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11).layer(service))
235    }
236}
237
238impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12> Layer<S>
239    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12)
240where
241    L1: Layer<L2::Service>,
242    L2: Layer<L3::Service>,
243    L3: Layer<L4::Service>,
244    L4: Layer<L5::Service>,
245    L5: Layer<L6::Service>,
246    L6: Layer<L7::Service>,
247    L7: Layer<L8::Service>,
248    L8: Layer<L9::Service>,
249    L9: Layer<L10::Service>,
250    L10: Layer<L11::Service>,
251    L11: Layer<L12::Service>,
252    L12: Layer<S>,
253{
254    type Service = L1::Service;
255
256    fn layer(&self, service: S) -> Self::Service {
257        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12) = self;
258        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12).layer(service))
259    }
260}
261
262impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13> Layer<S>
263    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13)
264where
265    L1: Layer<L2::Service>,
266    L2: Layer<L3::Service>,
267    L3: Layer<L4::Service>,
268    L4: Layer<L5::Service>,
269    L5: Layer<L6::Service>,
270    L6: Layer<L7::Service>,
271    L7: Layer<L8::Service>,
272    L8: Layer<L9::Service>,
273    L9: Layer<L10::Service>,
274    L10: Layer<L11::Service>,
275    L11: Layer<L12::Service>,
276    L12: Layer<L13::Service>,
277    L13: Layer<S>,
278{
279    type Service = L1::Service;
280
281    fn layer(&self, service: S) -> Self::Service {
282        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13) = self;
283        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13).layer(service))
284    }
285}
286
287impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14> Layer<S>
288    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14)
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<L12::Service>,
301    L12: Layer<L13::Service>,
302    L13: Layer<L14::Service>,
303    L14: Layer<S>,
304{
305    type Service = L1::Service;
306
307    fn layer(&self, service: S) -> Self::Service {
308        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14) = self;
309        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14).layer(service))
310    }
311}
312
313#[rustfmt::skip]
314impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15> Layer<S>
315    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15)
316where
317    L1: Layer<L2::Service>,
318    L2: Layer<L3::Service>,
319    L3: Layer<L4::Service>,
320    L4: Layer<L5::Service>,
321    L5: Layer<L6::Service>,
322    L6: Layer<L7::Service>,
323    L7: Layer<L8::Service>,
324    L8: Layer<L9::Service>,
325    L9: Layer<L10::Service>,
326    L10: Layer<L11::Service>,
327    L11: Layer<L12::Service>,
328    L12: Layer<L13::Service>,
329    L13: Layer<L14::Service>,
330    L14: Layer<L15::Service>,
331    L15: Layer<S>,
332{
333    type Service = L1::Service;
334
335    fn layer(&self, service: S) -> Self::Service {
336        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15) = self;
337        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15).layer(service))
338    }
339}
340
341#[rustfmt::skip]
342impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16> Layer<S>
343    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16)
344where
345    L1: Layer<L2::Service>,
346    L2: Layer<L3::Service>,
347    L3: Layer<L4::Service>,
348    L4: Layer<L5::Service>,
349    L5: Layer<L6::Service>,
350    L6: Layer<L7::Service>,
351    L7: Layer<L8::Service>,
352    L8: Layer<L9::Service>,
353    L9: Layer<L10::Service>,
354    L10: Layer<L11::Service>,
355    L11: Layer<L12::Service>,
356    L12: Layer<L13::Service>,
357    L13: Layer<L14::Service>,
358    L14: Layer<L15::Service>,
359    L15: Layer<L16::Service>,
360    L16: Layer<S>,
361{
362    type Service = L1::Service;
363
364    fn layer(&self, service: S) -> Self::Service {
365        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16) = self;
366        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16).layer(service))
367    }
368}
369
370#[rustfmt::skip]
371impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17> Layer<S>
372    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17)
373where
374    L1: Layer<L2::Service>,
375    L2: Layer<L3::Service>,
376    L3: Layer<L4::Service>,
377    L4: Layer<L5::Service>,
378    L5: Layer<L6::Service>,
379    L6: Layer<L7::Service>,
380    L7: Layer<L8::Service>,
381    L8: Layer<L9::Service>,
382    L9: Layer<L10::Service>,
383    L10: Layer<L11::Service>,
384    L11: Layer<L12::Service>,
385    L12: Layer<L13::Service>,
386    L13: Layer<L14::Service>,
387    L14: Layer<L15::Service>,
388    L15: Layer<L16::Service>,
389    L16: Layer<L17::Service>,
390    L17: 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, l15, l16, l17) = self;
396        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17).layer(service))
397    }
398}
399
400#[rustfmt::skip]
401impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18> Layer<S>
402    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18)
403where
404    L1: Layer<L2::Service>,
405    L2: Layer<L3::Service>,
406    L3: Layer<L4::Service>,
407    L4: Layer<L5::Service>,
408    L5: Layer<L6::Service>,
409    L6: Layer<L7::Service>,
410    L7: Layer<L8::Service>,
411    L8: Layer<L9::Service>,
412    L9: Layer<L10::Service>,
413    L10: Layer<L11::Service>,
414    L11: Layer<L12::Service>,
415    L12: Layer<L13::Service>,
416    L13: Layer<L14::Service>,
417    L14: Layer<L15::Service>,
418    L15: Layer<L16::Service>,
419    L16: Layer<L17::Service>,
420    L17: Layer<L18::Service>,
421    L18: Layer<S>,
422{
423    type Service = L1::Service;
424
425    fn layer(&self, service: S) -> Self::Service {
426        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18) = self;
427        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18).layer(service))
428    }
429}
430
431#[rustfmt::skip]
432impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19> Layer<S>
433    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19)
434where
435    L1: Layer<L2::Service>,
436    L2: Layer<L3::Service>,
437    L3: Layer<L4::Service>,
438    L4: Layer<L5::Service>,
439    L5: Layer<L6::Service>,
440    L6: Layer<L7::Service>,
441    L7: Layer<L8::Service>,
442    L8: Layer<L9::Service>,
443    L9: Layer<L10::Service>,
444    L10: Layer<L11::Service>,
445    L11: Layer<L12::Service>,
446    L12: Layer<L13::Service>,
447    L13: Layer<L14::Service>,
448    L14: Layer<L15::Service>,
449    L15: Layer<L16::Service>,
450    L16: Layer<L17::Service>,
451    L17: Layer<L18::Service>,
452    L18: Layer<L19::Service>,
453    L19: Layer<S>,
454{
455    type Service = L1::Service;
456
457    fn layer(&self, service: S) -> Self::Service {
458        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19) = self;
459        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19).layer(service))
460    }
461}
462
463#[rustfmt::skip]
464impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20> Layer<S>
465    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20)
466where
467    L1: Layer<L2::Service>,
468    L2: Layer<L3::Service>,
469    L3: Layer<L4::Service>,
470    L4: Layer<L5::Service>,
471    L5: Layer<L6::Service>,
472    L6: Layer<L7::Service>,
473    L7: Layer<L8::Service>,
474    L8: Layer<L9::Service>,
475    L9: Layer<L10::Service>,
476    L10: Layer<L11::Service>,
477    L11: Layer<L12::Service>,
478    L12: Layer<L13::Service>,
479    L13: Layer<L14::Service>,
480    L14: Layer<L15::Service>,
481    L15: Layer<L16::Service>,
482    L16: Layer<L17::Service>,
483    L17: Layer<L18::Service>,
484    L18: Layer<L19::Service>,
485    L19: Layer<L20::Service>,
486    L20: Layer<S>,
487{
488    type Service = L1::Service;
489
490    fn layer(&self, service: S) -> Self::Service {
491        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20) = self;
492        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20).layer(service))
493    }
494}
495
496#[rustfmt::skip]
497impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21> Layer<S>
498    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21)
499where
500    L1: Layer<L2::Service>,
501    L2: Layer<L3::Service>,
502    L3: Layer<L4::Service>,
503    L4: Layer<L5::Service>,
504    L5: Layer<L6::Service>,
505    L6: Layer<L7::Service>,
506    L7: Layer<L8::Service>,
507    L8: Layer<L9::Service>,
508    L9: Layer<L10::Service>,
509    L10: Layer<L11::Service>,
510    L11: Layer<L12::Service>,
511    L12: Layer<L13::Service>,
512    L13: Layer<L14::Service>,
513    L14: Layer<L15::Service>,
514    L15: Layer<L16::Service>,
515    L16: Layer<L17::Service>,
516    L17: Layer<L18::Service>,
517    L18: Layer<L19::Service>,
518    L19: Layer<L20::Service>,
519    L20: Layer<L21::Service>,
520    L21: Layer<S>,
521{
522    type Service = L1::Service;
523
524    fn layer(&self, service: S) -> Self::Service {
525        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21) = self;
526        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21).layer(service))
527    }
528}
529
530#[rustfmt::skip]
531impl<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>
532    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22)
533where
534    L1: Layer<L2::Service>,
535    L2: Layer<L3::Service>,
536    L3: Layer<L4::Service>,
537    L4: Layer<L5::Service>,
538    L5: Layer<L6::Service>,
539    L6: Layer<L7::Service>,
540    L7: Layer<L8::Service>,
541    L8: Layer<L9::Service>,
542    L9: Layer<L10::Service>,
543    L10: Layer<L11::Service>,
544    L11: Layer<L12::Service>,
545    L12: Layer<L13::Service>,
546    L13: Layer<L14::Service>,
547    L14: Layer<L15::Service>,
548    L15: Layer<L16::Service>,
549    L16: Layer<L17::Service>,
550    L17: Layer<L18::Service>,
551    L18: Layer<L19::Service>,
552    L19: Layer<L20::Service>,
553    L20: Layer<L21::Service>,
554    L21: Layer<L22::Service>,
555    L22: Layer<S>,
556{
557    type Service = L1::Service;
558
559    fn layer(&self, service: S) -> Self::Service {
560        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22) = self;
561        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))
562    }
563}
564
565#[rustfmt::skip]
566impl<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>
567    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22, L23)
568where
569    L1: Layer<L2::Service>,
570    L2: Layer<L3::Service>,
571    L3: Layer<L4::Service>,
572    L4: Layer<L5::Service>,
573    L5: Layer<L6::Service>,
574    L6: Layer<L7::Service>,
575    L7: Layer<L8::Service>,
576    L8: Layer<L9::Service>,
577    L9: Layer<L10::Service>,
578    L10: Layer<L11::Service>,
579    L11: Layer<L12::Service>,
580    L12: Layer<L13::Service>,
581    L13: Layer<L14::Service>,
582    L14: Layer<L15::Service>,
583    L15: Layer<L16::Service>,
584    L16: Layer<L17::Service>,
585    L17: Layer<L18::Service>,
586    L18: Layer<L19::Service>,
587    L19: Layer<L20::Service>,
588    L20: Layer<L21::Service>,
589    L21: Layer<L22::Service>,
590    L22: Layer<L23::Service>,
591    L23: Layer<S>,
592{
593    type Service = L1::Service;
594
595    fn layer(&self, service: S) -> Self::Service {
596        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;
597        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))
598    }
599}
600
601#[rustfmt::skip]
602impl<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>
603    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)
604where
605    L1: Layer<L2::Service>,
606    L2: Layer<L3::Service>,
607    L3: Layer<L4::Service>,
608    L4: Layer<L5::Service>,
609    L5: Layer<L6::Service>,
610    L6: Layer<L7::Service>,
611    L7: Layer<L8::Service>,
612    L8: Layer<L9::Service>,
613    L9: Layer<L10::Service>,
614    L10: Layer<L11::Service>,
615    L11: Layer<L12::Service>,
616    L12: Layer<L13::Service>,
617    L13: Layer<L14::Service>,
618    L14: Layer<L15::Service>,
619    L15: Layer<L16::Service>,
620    L16: Layer<L17::Service>,
621    L17: Layer<L18::Service>,
622    L18: Layer<L19::Service>,
623    L19: Layer<L20::Service>,
624    L20: Layer<L21::Service>,
625    L21: Layer<L22::Service>,
626    L22: Layer<L23::Service>,
627    L23: Layer<L24::Service>,
628    L24: Layer<S>,
629{
630    type Service = L1::Service;
631
632    fn layer(&self, service: S) -> Self::Service {
633        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;
634        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))
635    }
636}
637
638#[rustfmt::skip]
639impl<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>
640    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)
641where
642    L1: Layer<L2::Service>,
643    L2: Layer<L3::Service>,
644    L3: Layer<L4::Service>,
645    L4: Layer<L5::Service>,
646    L5: Layer<L6::Service>,
647    L6: Layer<L7::Service>,
648    L7: Layer<L8::Service>,
649    L8: Layer<L9::Service>,
650    L9: Layer<L10::Service>,
651    L10: Layer<L11::Service>,
652    L11: Layer<L12::Service>,
653    L12: Layer<L13::Service>,
654    L13: Layer<L14::Service>,
655    L14: Layer<L15::Service>,
656    L15: Layer<L16::Service>,
657    L16: Layer<L17::Service>,
658    L17: Layer<L18::Service>,
659    L18: Layer<L19::Service>,
660    L19: Layer<L20::Service>,
661    L20: Layer<L21::Service>,
662    L21: Layer<L22::Service>,
663    L22: Layer<L23::Service>,
664    L23: Layer<L24::Service>,
665    L24: Layer<L25::Service>,
666    L25: Layer<S>,
667{
668    type Service = L1::Service;
669
670    fn layer(&self, service: S) -> Self::Service {
671        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;
672        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))
673    }
674}
675
676mod into_error;
677#[doc(inline)]
678pub use into_error::{LayerErrorFn, LayerErrorStatic, MakeLayerError};
679
680mod hijack;
681#[doc(inline)]
682pub use hijack::{HijackLayer, HijackService};
683
684mod map_state;
685#[doc(inline)]
686pub use map_state::{MapState, MapStateLayer};
687
688mod layer_fn;
689#[doc(inline)]
690pub use layer_fn::{layer_fn, LayerFn};
691
692mod map_request;
693#[doc(inline)]
694pub use map_request::{MapRequest, MapRequestLayer};
695
696mod map_response;
697#[doc(inline)]
698pub use map_response::{MapResponse, MapResponseLayer};
699
700mod map_err;
701#[doc(inline)]
702pub use map_err::{MapErr, MapErrLayer};
703
704mod consume_err;
705#[doc(inline)]
706pub use consume_err::{ConsumeErr, ConsumeErrLayer};
707
708mod trace_err;
709#[doc(inline)]
710pub use trace_err::{TraceErr, TraceErrLayer};
711
712mod map_result;
713#[doc(inline)]
714pub use map_result::{MapResult, MapResultLayer};
715
716pub mod timeout;
717pub use timeout::{Timeout, TimeoutLayer};
718
719pub mod limit;
720pub use limit::{Limit, LimitLayer};
721
722pub mod add_extension;
723pub use add_extension::{AddExtension, AddExtensionLayer};
724
725pub mod get_extension;
726pub use get_extension::{GetExtension, GetExtensionLayer};
727
728macro_rules! impl_layer_either {
729    ($id:ident, $($param:ident),+ $(,)?) => {
730        impl<$($param),+, S> Layer<S> for crate::combinators::$id<$($param),+>
731        where
732            $($param: Layer<S>),+,
733        {
734            type Service = crate::combinators::$id<$($param::Service),+>;
735
736            fn layer(&self, inner: S) -> Self::Service {
737                match self {
738                    $(
739                        crate::combinators::$id::$param(layer) => crate::combinators::$id::$param(layer.layer(inner)),
740                    )+
741                }
742            }
743        }
744    };
745}
746
747crate::combinators::impl_either!(impl_layer_either);