1use core::fmt::Debug;
8
9pub trait Layer<S>: Sized {
11 type Service;
13
14 fn layer(&self, inner: S) -> Self::Service;
16
17 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
66pub 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 #[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}