zon_core/middleware/
mod.rs

1use crate::either::Either;
2
3mod tuples;
4
5pub trait HttpMiddleware<S> {
6    type Service;
7
8    fn apply(self, inner: S) -> Self::Service;
9}
10
11/// The unit type can be used as a no-op middleware, mapping `S` to itself.
12impl<S> HttpMiddleware<S> for () {
13    type Service = S;
14
15    fn apply(self, service: S) -> Self::Service {
16        service
17    }
18}
19
20impl<S, M> HttpMiddleware<S> for Option<M>
21where
22    M: HttpMiddleware<S>,
23{
24    type Service = Either<M::Service, S>;
25
26    fn apply(self, inner: S) -> Self::Service {
27        match self {
28            Some(mid) => Either::A(mid.apply(inner)),
29            None => Either::B(inner),
30        }
31    }
32}