tower_web/middleware/
chain.rs

1use super::Middleware;
2
3use tower_service::Service;
4
5/// Two middlewares chained together.
6///
7/// This type is produced by `Middleware::chain`.
8#[derive(Debug)]
9pub struct Chain<Inner, Outer>
10{
11    inner: Inner,
12    outer: Outer,
13}
14
15impl<Inner, Outer> Chain<Inner, Outer> {
16    /// Create a new `Chain`.
17    pub fn new(inner: Inner, outer: Outer) -> Self {
18        Chain {
19            inner,
20            outer,
21        }
22    }
23}
24
25impl<S, Inner, Outer> Middleware<S> for Chain<Inner, Outer>
26where S: Service,
27      Inner: Middleware<S>,
28      Outer: Middleware<Inner::Service>,
29{
30    type Request = Outer::Request;
31    type Response = Outer::Response;
32    type Error = Outer::Error;
33    type Service = Outer::Service;
34
35    fn wrap(&self, service: S) -> Self::Service {
36        self.outer.wrap(
37            self.inner.wrap(service))
38    }
39}
40
41impl<T, Inner, Outer> ::util::Chain<T> for Chain<Inner, Outer> {
42    type Output = Chain<Self, T>;
43
44    fn chain(self, other: T) -> Self::Output {
45        Chain::new(self, other)
46    }
47}