Skip to main content

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
7use core::fmt::Debug;
8
9/// A layer that produces a Layered service (middleware(inner service)).
10pub trait Layer<S>: Sized {
11    /// The service produced by the layer.
12    type Service;
13
14    /// Wrap the given service with the middleware, returning a new service.
15    fn layer(&self, inner: S) -> Self::Service;
16
17    /// Same as `layer` but consuming self after the service was created.
18    ///
19    /// This is useful in case you no longer need the Layer after the service
20    /// is created. By default this calls `layer` but if your `Layer` impl
21    /// requires cloning you can impl this method as well to avoid the cloning
22    /// for the cases where you no longer need the data in the `Layer` after
23    /// service ceation.
24    fn into_layer(self, inner: S) -> Self::Service {
25        self.layer(inner)
26    }
27}
28
29impl<T, S> Layer<S> for &T
30where
31    T: Layer<S>,
32{
33    type Service = T::Service;
34
35    #[inline(always)]
36    fn layer(&self, inner: S) -> Self::Service {
37        (**self).layer(inner)
38    }
39
40    fn into_layer(self, inner: S) -> Self::Service {
41        (*self).layer(inner)
42    }
43}
44
45impl<L, S> Layer<S> for Option<L>
46where
47    L: Layer<S>,
48{
49    type Service = MaybeLayeredService<S, L>;
50
51    fn layer(&self, inner: S) -> Self::Service {
52        match self {
53            Some(layer) => MaybeLayeredService(MaybeLayeredSvc::Enabled(layer.layer(inner))),
54            None => MaybeLayeredService(MaybeLayeredSvc::Disabled(inner)),
55        }
56    }
57
58    fn into_layer(self, inner: S) -> Self::Service {
59        match self {
60            Some(layer) => MaybeLayeredService(MaybeLayeredSvc::Enabled(layer.into_layer(inner))),
61            None => MaybeLayeredService(MaybeLayeredSvc::Disabled(inner)),
62        }
63    }
64}
65
66/// [`MaybeLayeredService`] is [`Service`] which is created by using an [`Option<Layer>`]
67pub struct MaybeLayeredService<S, L: Layer<S>>(MaybeLayeredSvc<S, L>);
68
69impl<S, L> Debug for MaybeLayeredService<S, L>
70where
71    S: Debug,
72    L: Layer<S>,
73    L::Service: Debug,
74{
75    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
76        f.debug_tuple("MaybeLayeredService").field(&self.0).finish()
77    }
78}
79
80impl<S, L> Clone for MaybeLayeredService<S, L>
81where
82    S: Clone,
83    L: Layer<S>,
84    L::Service: Clone,
85{
86    fn clone(&self) -> Self {
87        Self(self.0.clone())
88    }
89}
90
91enum MaybeLayeredSvc<S, L>
92where
93    L: Layer<S>,
94{
95    Enabled(L::Service),
96    Disabled(S),
97}
98
99impl<S, L> Debug for MaybeLayeredSvc<S, L>
100where
101    S: Debug,
102    L: Layer<S>,
103    L::Service: Debug,
104{
105    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
106        match self {
107            Self::Enabled(service) => f.debug_tuple("Enabled").field(service).finish(),
108            Self::Disabled(service) => f.debug_tuple("Disabled").field(service).finish(),
109        }
110    }
111}
112
113impl<S, L> Clone for MaybeLayeredSvc<S, L>
114where
115    S: Clone,
116    L: Layer<S>,
117    L::Service: Clone,
118{
119    fn clone(&self) -> Self {
120        match self {
121            Self::Enabled(svc) => Self::Enabled(svc.clone()),
122            Self::Disabled(inner) => Self::Disabled(inner.clone()),
123        }
124    }
125}
126
127impl<S, L, Input> Service<Input> for MaybeLayeredService<S, L>
128where
129    S: Service<Input>,
130    L: Layer<S> + 'static,
131    L::Service: Service<Input, Output = S::Output, Error: Into<S::Error>>,
132    Input: Send + 'static,
133{
134    type Error = S::Error;
135    type Output = S::Output;
136
137    async fn serve(&self, input: Input) -> Result<Self::Output, Self::Error> {
138        match &self.0 {
139            MaybeLayeredSvc::Enabled(svc) => svc.serve(input).await.map_err(Into::into),
140            MaybeLayeredSvc::Disabled(inner) => inner.serve(input).await,
141        }
142    }
143}
144
145impl<S> Layer<S> for () {
146    type Service = S;
147
148    fn layer(&self, service: S) -> Self::Service {
149        service
150    }
151}
152
153impl<S, L1> Layer<S> for (L1,)
154where
155    L1: Layer<S>,
156{
157    type Service = L1::Service;
158
159    fn layer(&self, service: S) -> Self::Service {
160        let (l1,) = self;
161        l1.layer(service)
162    }
163
164    fn into_layer(self, service: S) -> Self::Service {
165        let (l1,) = self;
166        l1.into_layer(service)
167    }
168}
169
170impl<S, L1, L2> Layer<S> for (L1, L2)
171where
172    L1: Layer<L2::Service>,
173    L2: Layer<S>,
174{
175    type Service = L1::Service;
176
177    fn layer(&self, service: S) -> Self::Service {
178        let (l1, l2) = self;
179        l1.layer(l2.layer(service))
180    }
181
182    fn into_layer(self, service: S) -> Self::Service {
183        let (l1, l2) = self;
184        l1.into_layer(l2.into_layer(service))
185    }
186}
187
188impl<S, L1, L2, L3> Layer<S> for (L1, L2, L3)
189where
190    L1: Layer<L2::Service>,
191    L2: Layer<L3::Service>,
192    L3: Layer<S>,
193{
194    type Service = L1::Service;
195
196    fn layer(&self, service: S) -> Self::Service {
197        let (l1, l2, l3) = self;
198        l1.layer((l2, l3).layer(service))
199    }
200
201    fn into_layer(self, service: S) -> Self::Service {
202        let (l1, l2, l3) = self;
203        l1.into_layer((l2, l3).into_layer(service))
204    }
205}
206
207impl<S, L1, L2, L3, L4> Layer<S> for (L1, L2, L3, L4)
208where
209    L1: Layer<L2::Service>,
210    L2: Layer<L3::Service>,
211    L3: Layer<L4::Service>,
212    L4: Layer<S>,
213{
214    type Service = L1::Service;
215
216    fn layer(&self, service: S) -> Self::Service {
217        let (l1, l2, l3, l4) = self;
218        l1.layer((l2, l3, l4).layer(service))
219    }
220
221    fn into_layer(self, service: S) -> Self::Service {
222        let (l1, l2, l3, l4) = self;
223        l1.into_layer((l2, l3, l4).into_layer(service))
224    }
225}
226
227impl<S, L1, L2, L3, L4, L5> Layer<S> for (L1, L2, L3, L4, L5)
228where
229    L1: Layer<L2::Service>,
230    L2: Layer<L3::Service>,
231    L3: Layer<L4::Service>,
232    L4: Layer<L5::Service>,
233    L5: Layer<S>,
234{
235    type Service = L1::Service;
236
237    fn layer(&self, service: S) -> Self::Service {
238        let (l1, l2, l3, l4, l5) = self;
239        l1.layer((l2, l3, l4, l5).layer(service))
240    }
241
242    fn into_layer(self, service: S) -> Self::Service {
243        let (l1, l2, l3, l4, l5) = self;
244        l1.into_layer((l2, l3, l4, l5).into_layer(service))
245    }
246}
247
248impl<S, L1, L2, L3, L4, L5, L6> Layer<S> for (L1, L2, L3, L4, L5, L6)
249where
250    L1: Layer<L2::Service>,
251    L2: Layer<L3::Service>,
252    L3: Layer<L4::Service>,
253    L4: Layer<L5::Service>,
254    L5: Layer<L6::Service>,
255    L6: Layer<S>,
256{
257    type Service = L1::Service;
258
259    fn layer(&self, service: S) -> Self::Service {
260        let (l1, l2, l3, l4, l5, l6) = self;
261        l1.layer((l2, l3, l4, l5, l6).layer(service))
262    }
263
264    fn into_layer(self, service: S) -> Self::Service {
265        let (l1, l2, l3, l4, l5, l6) = self;
266        l1.into_layer((l2, l3, l4, l5, l6).into_layer(service))
267    }
268}
269
270impl<S, L1, L2, L3, L4, L5, L6, L7> Layer<S> for (L1, L2, L3, L4, L5, L6, L7)
271where
272    L1: Layer<L2::Service>,
273    L2: Layer<L3::Service>,
274    L3: Layer<L4::Service>,
275    L4: Layer<L5::Service>,
276    L5: Layer<L6::Service>,
277    L6: Layer<L7::Service>,
278    L7: Layer<S>,
279{
280    type Service = L1::Service;
281
282    fn layer(&self, service: S) -> Self::Service {
283        let (l1, l2, l3, l4, l5, l6, l7) = self;
284        l1.layer((l2, l3, l4, l5, l6, l7).layer(service))
285    }
286
287    fn into_layer(self, service: S) -> Self::Service {
288        let (l1, l2, l3, l4, l5, l6, l7) = self;
289        l1.into_layer((l2, l3, l4, l5, l6, l7).into_layer(service))
290    }
291}
292
293impl<S, L1, L2, L3, L4, L5, L6, L7, L8> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8)
294where
295    L1: Layer<L2::Service>,
296    L2: Layer<L3::Service>,
297    L3: Layer<L4::Service>,
298    L4: Layer<L5::Service>,
299    L5: Layer<L6::Service>,
300    L6: Layer<L7::Service>,
301    L7: Layer<L8::Service>,
302    L8: Layer<S>,
303{
304    type Service = L1::Service;
305
306    fn layer(&self, service: S) -> Self::Service {
307        let (l1, l2, l3, l4, l5, l6, l7, l8) = self;
308        l1.layer((l2, l3, l4, l5, l6, l7, l8).layer(service))
309    }
310
311    fn into_layer(self, service: S) -> Self::Service {
312        let (l1, l2, l3, l4, l5, l6, l7, l8) = self;
313        l1.into_layer((l2, l3, l4, l5, l6, l7, l8).into_layer(service))
314    }
315}
316
317impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8, L9)
318where
319    L1: Layer<L2::Service>,
320    L2: Layer<L3::Service>,
321    L3: Layer<L4::Service>,
322    L4: Layer<L5::Service>,
323    L5: Layer<L6::Service>,
324    L6: Layer<L7::Service>,
325    L7: Layer<L8::Service>,
326    L8: Layer<L9::Service>,
327    L9: Layer<S>,
328{
329    type Service = L1::Service;
330
331    fn layer(&self, service: S) -> Self::Service {
332        let (l1, l2, l3, l4, l5, l6, l7, l8, l9) = self;
333        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9).layer(service))
334    }
335
336    fn into_layer(self, service: S) -> Self::Service {
337        let (l1, l2, l3, l4, l5, l6, l7, l8, l9) = self;
338        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9).into_layer(service))
339    }
340}
341
342impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10> Layer<S>
343    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10)
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<S>,
355{
356    type Service = L1::Service;
357
358    fn layer(&self, service: S) -> Self::Service {
359        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10) = self;
360        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10).layer(service))
361    }
362
363    fn into_layer(self, service: S) -> Self::Service {
364        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10) = self;
365        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10).into_layer(service))
366    }
367}
368
369impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11> Layer<S>
370    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11)
371where
372    L1: Layer<L2::Service>,
373    L2: Layer<L3::Service>,
374    L3: Layer<L4::Service>,
375    L4: Layer<L5::Service>,
376    L5: Layer<L6::Service>,
377    L6: Layer<L7::Service>,
378    L7: Layer<L8::Service>,
379    L8: Layer<L9::Service>,
380    L9: Layer<L10::Service>,
381    L10: Layer<L11::Service>,
382    L11: Layer<S>,
383{
384    type Service = L1::Service;
385
386    fn layer(&self, service: S) -> Self::Service {
387        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11) = self;
388        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11).layer(service))
389    }
390
391    fn into_layer(self, service: S) -> Self::Service {
392        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11) = self;
393        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11).into_layer(service))
394    }
395}
396
397impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12> Layer<S>
398    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12)
399where
400    L1: Layer<L2::Service>,
401    L2: Layer<L3::Service>,
402    L3: Layer<L4::Service>,
403    L4: Layer<L5::Service>,
404    L5: Layer<L6::Service>,
405    L6: Layer<L7::Service>,
406    L7: Layer<L8::Service>,
407    L8: Layer<L9::Service>,
408    L9: Layer<L10::Service>,
409    L10: Layer<L11::Service>,
410    L11: Layer<L12::Service>,
411    L12: Layer<S>,
412{
413    type Service = L1::Service;
414
415    fn layer(&self, service: S) -> Self::Service {
416        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12) = self;
417        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12).layer(service))
418    }
419
420    fn into_layer(self, service: S) -> Self::Service {
421        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12) = self;
422        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12).into_layer(service))
423    }
424}
425
426impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13> Layer<S>
427    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13)
428where
429    L1: Layer<L2::Service>,
430    L2: Layer<L3::Service>,
431    L3: Layer<L4::Service>,
432    L4: Layer<L5::Service>,
433    L5: Layer<L6::Service>,
434    L6: Layer<L7::Service>,
435    L7: Layer<L8::Service>,
436    L8: Layer<L9::Service>,
437    L9: Layer<L10::Service>,
438    L10: Layer<L11::Service>,
439    L11: Layer<L12::Service>,
440    L12: Layer<L13::Service>,
441    L13: Layer<S>,
442{
443    type Service = L1::Service;
444
445    fn layer(&self, service: S) -> Self::Service {
446        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13) = self;
447        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13).layer(service))
448    }
449
450    fn into_layer(self, service: S) -> Self::Service {
451        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13) = self;
452        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13).into_layer(service))
453    }
454}
455
456impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14> Layer<S>
457    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14)
458where
459    L1: Layer<L2::Service>,
460    L2: Layer<L3::Service>,
461    L3: Layer<L4::Service>,
462    L4: Layer<L5::Service>,
463    L5: Layer<L6::Service>,
464    L6: Layer<L7::Service>,
465    L7: Layer<L8::Service>,
466    L8: Layer<L9::Service>,
467    L9: Layer<L10::Service>,
468    L10: Layer<L11::Service>,
469    L11: Layer<L12::Service>,
470    L12: Layer<L13::Service>,
471    L13: Layer<L14::Service>,
472    L14: Layer<S>,
473{
474    type Service = L1::Service;
475
476    fn layer(&self, service: S) -> Self::Service {
477        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14) = self;
478        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14).layer(service))
479    }
480
481    fn into_layer(self, service: S) -> Self::Service {
482        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14) = self;
483        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14).into_layer(service))
484    }
485}
486
487#[rustfmt::skip]
488impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15> Layer<S>
489    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15)
490where
491    L1: Layer<L2::Service>,
492    L2: Layer<L3::Service>,
493    L3: Layer<L4::Service>,
494    L4: Layer<L5::Service>,
495    L5: Layer<L6::Service>,
496    L6: Layer<L7::Service>,
497    L7: Layer<L8::Service>,
498    L8: Layer<L9::Service>,
499    L9: Layer<L10::Service>,
500    L10: Layer<L11::Service>,
501    L11: Layer<L12::Service>,
502    L12: Layer<L13::Service>,
503    L13: Layer<L14::Service>,
504    L14: Layer<L15::Service>,
505    L15: Layer<S>,
506{
507    type Service = L1::Service;
508
509    fn layer(&self, service: S) -> Self::Service {
510        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15) = self;
511        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15).layer(service))
512    }
513
514    fn into_layer(self, service: S) -> Self::Service {
515        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15) = self;
516        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15).into_layer(service))
517    }
518}
519
520#[rustfmt::skip]
521impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16> Layer<S>
522    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16)
523where
524    L1: Layer<L2::Service>,
525    L2: Layer<L3::Service>,
526    L3: Layer<L4::Service>,
527    L4: Layer<L5::Service>,
528    L5: Layer<L6::Service>,
529    L6: Layer<L7::Service>,
530    L7: Layer<L8::Service>,
531    L8: Layer<L9::Service>,
532    L9: Layer<L10::Service>,
533    L10: Layer<L11::Service>,
534    L11: Layer<L12::Service>,
535    L12: Layer<L13::Service>,
536    L13: Layer<L14::Service>,
537    L14: Layer<L15::Service>,
538    L15: Layer<L16::Service>,
539    L16: Layer<S>,
540{
541    type Service = L1::Service;
542
543    fn layer(&self, service: S) -> Self::Service {
544        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16) = self;
545        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16).layer(service))
546    }
547
548    fn into_layer(self, service: S) -> Self::Service {
549        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16) = self;
550        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16).into_layer(service))
551    }
552}
553
554#[rustfmt::skip]
555impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17> Layer<S>
556    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17)
557where
558    L1: Layer<L2::Service>,
559    L2: Layer<L3::Service>,
560    L3: Layer<L4::Service>,
561    L4: Layer<L5::Service>,
562    L5: Layer<L6::Service>,
563    L6: Layer<L7::Service>,
564    L7: Layer<L8::Service>,
565    L8: Layer<L9::Service>,
566    L9: Layer<L10::Service>,
567    L10: Layer<L11::Service>,
568    L11: Layer<L12::Service>,
569    L12: Layer<L13::Service>,
570    L13: Layer<L14::Service>,
571    L14: Layer<L15::Service>,
572    L15: Layer<L16::Service>,
573    L16: Layer<L17::Service>,
574    L17: Layer<S>,
575{
576    type Service = L1::Service;
577
578    fn layer(&self, service: S) -> Self::Service {
579        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17) = self;
580        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17).layer(service))
581    }
582
583    fn into_layer(self, service: S) -> Self::Service {
584        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17) = self;
585        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17).into_layer(service))
586    }
587}
588
589#[rustfmt::skip]
590impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18> Layer<S>
591    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18)
592where
593    L1: Layer<L2::Service>,
594    L2: Layer<L3::Service>,
595    L3: Layer<L4::Service>,
596    L4: Layer<L5::Service>,
597    L5: Layer<L6::Service>,
598    L6: Layer<L7::Service>,
599    L7: Layer<L8::Service>,
600    L8: Layer<L9::Service>,
601    L9: Layer<L10::Service>,
602    L10: Layer<L11::Service>,
603    L11: Layer<L12::Service>,
604    L12: Layer<L13::Service>,
605    L13: Layer<L14::Service>,
606    L14: Layer<L15::Service>,
607    L15: Layer<L16::Service>,
608    L16: Layer<L17::Service>,
609    L17: Layer<L18::Service>,
610    L18: Layer<S>,
611{
612    type Service = L1::Service;
613
614    fn layer(&self, service: S) -> Self::Service {
615        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18) = self;
616        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18).layer(service))
617    }
618
619    fn into_layer(self, service: S) -> Self::Service {
620        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18) = self;
621        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18).into_layer(service))
622    }
623}
624
625#[rustfmt::skip]
626impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19> Layer<S>
627    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19)
628where
629    L1: Layer<L2::Service>,
630    L2: Layer<L3::Service>,
631    L3: Layer<L4::Service>,
632    L4: Layer<L5::Service>,
633    L5: Layer<L6::Service>,
634    L6: Layer<L7::Service>,
635    L7: Layer<L8::Service>,
636    L8: Layer<L9::Service>,
637    L9: Layer<L10::Service>,
638    L10: Layer<L11::Service>,
639    L11: Layer<L12::Service>,
640    L12: Layer<L13::Service>,
641    L13: Layer<L14::Service>,
642    L14: Layer<L15::Service>,
643    L15: Layer<L16::Service>,
644    L16: Layer<L17::Service>,
645    L17: Layer<L18::Service>,
646    L18: Layer<L19::Service>,
647    L19: Layer<S>,
648{
649    type Service = L1::Service;
650
651    fn 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) = self;
653        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19).layer(service))
654    }
655
656    fn into_layer(self, service: S) -> Self::Service {
657        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19) = self;
658        l1.into_layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19).into_layer(service))
659    }
660}
661
662#[rustfmt::skip]
663impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20> Layer<S>
664    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20)
665where
666    L1: Layer<L2::Service>,
667    L2: Layer<L3::Service>,
668    L3: Layer<L4::Service>,
669    L4: Layer<L5::Service>,
670    L5: Layer<L6::Service>,
671    L6: Layer<L7::Service>,
672    L7: Layer<L8::Service>,
673    L8: Layer<L9::Service>,
674    L9: Layer<L10::Service>,
675    L10: Layer<L11::Service>,
676    L11: Layer<L12::Service>,
677    L12: Layer<L13::Service>,
678    L13: Layer<L14::Service>,
679    L14: Layer<L15::Service>,
680    L15: Layer<L16::Service>,
681    L16: Layer<L17::Service>,
682    L17: Layer<L18::Service>,
683    L18: Layer<L19::Service>,
684    L19: Layer<L20::Service>,
685    L20: Layer<S>,
686{
687    type Service = L1::Service;
688
689    fn layer(&self, service: S) -> Self::Service {
690        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20) = self;
691        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20).layer(service))
692    }
693
694    fn into_layer(self, service: S) -> Self::Service {
695        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20) = self;
696        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))
697    }
698}
699
700#[rustfmt::skip]
701impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21> Layer<S>
702    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21)
703where
704    L1: Layer<L2::Service>,
705    L2: Layer<L3::Service>,
706    L3: Layer<L4::Service>,
707    L4: Layer<L5::Service>,
708    L5: Layer<L6::Service>,
709    L6: Layer<L7::Service>,
710    L7: Layer<L8::Service>,
711    L8: Layer<L9::Service>,
712    L9: Layer<L10::Service>,
713    L10: Layer<L11::Service>,
714    L11: Layer<L12::Service>,
715    L12: Layer<L13::Service>,
716    L13: Layer<L14::Service>,
717    L14: Layer<L15::Service>,
718    L15: Layer<L16::Service>,
719    L16: Layer<L17::Service>,
720    L17: Layer<L18::Service>,
721    L18: Layer<L19::Service>,
722    L19: Layer<L20::Service>,
723    L20: Layer<L21::Service>,
724    L21: Layer<S>,
725{
726    type Service = L1::Service;
727
728    fn layer(&self, service: S) -> Self::Service {
729        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21) = self;
730        l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21).layer(service))
731    }
732
733    fn into_layer(self, service: S) -> Self::Service {
734        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21) = self;
735        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))
736    }
737}
738
739#[rustfmt::skip]
740impl<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>
741    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22)
742where
743    L1: Layer<L2::Service>,
744    L2: Layer<L3::Service>,
745    L3: Layer<L4::Service>,
746    L4: Layer<L5::Service>,
747    L5: Layer<L6::Service>,
748    L6: Layer<L7::Service>,
749    L7: Layer<L8::Service>,
750    L8: Layer<L9::Service>,
751    L9: Layer<L10::Service>,
752    L10: Layer<L11::Service>,
753    L11: Layer<L12::Service>,
754    L12: Layer<L13::Service>,
755    L13: Layer<L14::Service>,
756    L14: Layer<L15::Service>,
757    L15: Layer<L16::Service>,
758    L16: Layer<L17::Service>,
759    L17: Layer<L18::Service>,
760    L18: Layer<L19::Service>,
761    L19: Layer<L20::Service>,
762    L20: Layer<L21::Service>,
763    L21: Layer<L22::Service>,
764    L22: Layer<S>,
765{
766    type Service = L1::Service;
767
768    fn layer(&self, service: S) -> Self::Service {
769        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22) = self;
770        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))
771    }
772
773    fn into_layer(self, service: S) -> Self::Service {
774        let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22) = self;
775        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))
776    }
777}
778
779#[rustfmt::skip]
780impl<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>
781    for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22, L23)
782where
783    L1: Layer<L2::Service>,
784    L2: Layer<L3::Service>,
785    L3: Layer<L4::Service>,
786    L4: Layer<L5::Service>,
787    L5: Layer<L6::Service>,
788    L6: Layer<L7::Service>,
789    L7: Layer<L8::Service>,
790    L8: Layer<L9::Service>,
791    L9: Layer<L10::Service>,
792    L10: Layer<L11::Service>,
793    L11: Layer<L12::Service>,
794    L12: Layer<L13::Service>,
795    L13: Layer<L14::Service>,
796    L14: Layer<L15::Service>,
797    L15: Layer<L16::Service>,
798    L16: Layer<L17::Service>,
799    L17: Layer<L18::Service>,
800    L18: Layer<L19::Service>,
801    L19: Layer<L20::Service>,
802    L20: Layer<L21::Service>,
803    L21: Layer<L22::Service>,
804    L22: Layer<L23::Service>,
805    L23: Layer<S>,
806{
807    type Service = L1::Service;
808
809    fn layer(&self, service: S) -> Self::Service {
810        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;
811        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))
812    }
813
814    fn into_layer(self, service: S) -> Self::Service {
815        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;
816        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))
817    }
818}
819
820#[rustfmt::skip]
821impl<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>
822    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)
823where
824    L1: Layer<L2::Service>,
825    L2: Layer<L3::Service>,
826    L3: Layer<L4::Service>,
827    L4: Layer<L5::Service>,
828    L5: Layer<L6::Service>,
829    L6: Layer<L7::Service>,
830    L7: Layer<L8::Service>,
831    L8: Layer<L9::Service>,
832    L9: Layer<L10::Service>,
833    L10: Layer<L11::Service>,
834    L11: Layer<L12::Service>,
835    L12: Layer<L13::Service>,
836    L13: Layer<L14::Service>,
837    L14: Layer<L15::Service>,
838    L15: Layer<L16::Service>,
839    L16: Layer<L17::Service>,
840    L17: Layer<L18::Service>,
841    L18: Layer<L19::Service>,
842    L19: Layer<L20::Service>,
843    L20: Layer<L21::Service>,
844    L21: Layer<L22::Service>,
845    L22: Layer<L23::Service>,
846    L23: Layer<L24::Service>,
847    L24: Layer<S>,
848{
849    type Service = L1::Service;
850
851    fn layer(&self, service: S) -> Self::Service {
852        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;
853        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))
854    }
855
856    fn into_layer(self, service: S) -> Self::Service {
857        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;
858        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))
859    }
860}
861
862#[rustfmt::skip]
863impl<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>
864    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)
865where
866    L1: Layer<L2::Service>,
867    L2: Layer<L3::Service>,
868    L3: Layer<L4::Service>,
869    L4: Layer<L5::Service>,
870    L5: Layer<L6::Service>,
871    L6: Layer<L7::Service>,
872    L7: Layer<L8::Service>,
873    L8: Layer<L9::Service>,
874    L9: Layer<L10::Service>,
875    L10: Layer<L11::Service>,
876    L11: Layer<L12::Service>,
877    L12: Layer<L13::Service>,
878    L13: Layer<L14::Service>,
879    L14: Layer<L15::Service>,
880    L15: Layer<L16::Service>,
881    L16: Layer<L17::Service>,
882    L17: Layer<L18::Service>,
883    L18: Layer<L19::Service>,
884    L19: Layer<L20::Service>,
885    L20: Layer<L21::Service>,
886    L21: Layer<L22::Service>,
887    L22: Layer<L23::Service>,
888    L23: Layer<L24::Service>,
889    L24: Layer<L25::Service>,
890    L25: Layer<S>,
891{
892    type Service = L1::Service;
893
894    fn layer(&self, service: S) -> Self::Service {
895        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;
896        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))
897    }
898
899    fn into_layer(self, service: S) -> Self::Service {
900        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;
901        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))
902    }
903}
904
905mod into_error;
906#[doc(inline)]
907pub use into_error::{LayerErrorFn, LayerErrorStatic, MakeLayerError};
908
909mod hijack;
910#[doc(inline)]
911pub use hijack::{HijackLayer, HijackService};
912
913mod into_err;
914#[doc(inline)]
915pub use into_err::{IntoErr, IntoErrLayer};
916
917mod layer_fn;
918#[doc(inline)]
919pub use layer_fn::{LayerFn, layer_fn};
920
921mod map_input;
922#[doc(inline)]
923pub use map_input::{MapInput, MapInputLayer};
924
925mod map_output;
926#[doc(inline)]
927pub use map_output::{MapOutput, MapOutputLayer};
928
929mod map_err;
930#[doc(inline)]
931pub use map_err::{MapErr, MapErrLayer};
932
933pub mod consume_err;
934#[doc(inline)]
935pub use consume_err::{ConsumeErr, ConsumeErrLayer};
936
937pub mod count_input;
938#[doc(inline)]
939pub use count_input::{CountInput, CountInputLayer};
940
941mod trace_err;
942#[doc(inline)]
943pub use trace_err::{TraceErr, TraceErrLayer};
944
945mod map_result;
946#[doc(inline)]
947pub use map_result::{MapResult, MapResultLayer};
948
949#[cfg(feature = "std")]
950#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
951mod graceful_io;
952#[cfg(feature = "std")]
953#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
954#[doc(inline)]
955pub use graceful_io::{GracefulIoLayer, GracefulIoService};
956
957#[cfg(feature = "std")]
958#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
959pub mod timeout;
960#[cfg(feature = "std")]
961#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
962pub use timeout::{Timeout, TimeoutLayer};
963
964#[cfg(feature = "std")]
965#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
966pub mod abort;
967#[cfg(feature = "std")]
968#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
969pub use abort::{Abortable, AbortableLayer};
970
971pub mod limit;
972pub use limit::{Limit, LimitLayer};
973
974pub mod add_extension;
975pub use add_extension::{
976    AddInputExtension, AddInputExtensionLayer, AddOutputExtension, AddOutputExtensionLayer,
977};
978
979mod arc;
980pub use arc::ArcLayer;
981
982pub mod get_extension;
983pub use get_extension::{
984    GetInputExtensionOwned, GetInputExtensionOwnedLayer, GetInputExtensionRef,
985    GetInputExtensionRefLayer, GetOutputExtensionOwned, GetOutputExtensionOwnedLayer,
986    GetOutputExtensionRef, GetOutputExtensionRefLayer,
987};
988
989use crate::Service;
990
991macro_rules! impl_layer_either {
992    ($id:ident, $($param:ident),+ $(,)?) => {
993        impl<$($param),+, S> Layer<S> for crate::combinators::$id<$($param),+>
994        where
995            $($param: Layer<S>),+,
996        {
997            type Service = crate::combinators::$id<$($param::Service),+>;
998
999            fn layer(&self, inner: S) -> Self::Service {
1000                match self {
1001                    $(
1002                        crate::combinators::$id::$param(layer) => crate::combinators::$id::$param(layer.layer(inner)),
1003                    )+
1004                }
1005            }
1006
1007            fn into_layer(self, inner: S) -> Self::Service {
1008                match self {
1009                    $(
1010                        crate::combinators::$id::$param(layer) => crate::combinators::$id::$param(layer.into_layer(inner)),
1011                    )+
1012                }
1013            }
1014        }
1015    };
1016}
1017
1018crate::combinators::impl_either!(impl_layer_either);
1019
1020#[cfg(all(test, feature = "std"))]
1021mod tests {
1022    use rama_error::BoxError;
1023
1024    use crate::{ServiceInput, extensions::Extension, service::service_fn};
1025
1026    use super::*;
1027
1028    #[derive(Debug, Clone, Extension)]
1029    struct TestLayerLabel;
1030
1031    // These tests here are not to test specific layers, but just to test that `Layer`  works
1032    // and that `Option<Layer>` also works
1033
1034    #[tokio::test]
1035    async fn simple_input_layer() {
1036        let svc = (GetInputExtensionRefLayer::new(|_: &TestLayerLabel| {}))
1037            .into_layer(service_fn(async || Ok::<_, BoxError>(())));
1038
1039        svc.serve(ServiceInput::new(())).await.unwrap();
1040    }
1041
1042    #[tokio::test]
1043    async fn simple_optional_layer() {
1044        let maybe_layer = Some(GetInputExtensionRefLayer::new(|_: &TestLayerLabel| {}));
1045        let svc = (maybe_layer).into_layer(service_fn(async || Ok::<_, BoxError>(())));
1046
1047        svc.serve(ServiceInput::new(())).await.unwrap();
1048    }
1049}