tower_layer

Trait Layer

Source
pub trait Layer<S> {
    type Service;

    // Required method
    fn layer(&self, inner: S) -> Self::Service;
}
Expand description

Decorates a Service, transforming either the request or the response.

Often, many of the pieces needed for writing network applications can be reused across multiple services. The Layer trait can be used to write reusable components that can be applied to very different kinds of services; for example, it can be applied to services operating on different protocols, and to both the client and server side of a network transaction.

§Log

Take request logging as an example:


pub struct LogLayer {
    target: &'static str,
}

impl<S> Layer<S> for LogLayer {
    type Service = LogService<S>;

    fn layer(&self, service: S) -> Self::Service {
        LogService {
            target: self.target,
            service
        }
    }
}

// This service implements the Log behavior
pub struct LogService<S> {
    target: &'static str,
    service: S,
}

impl<S, Request> Service<Request> for LogService<S>
where
    S: Service<Request>,
    Request: fmt::Debug,
{
    type Response = S::Response;
    type Error = S::Error;
    type Future = S::Future;

    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
        self.service.poll_ready(cx)
    }

    fn call(&mut self, request: Request) -> Self::Future {
        // Insert log statement here or other functionality
        println!("request = {:?}, target = {:?}", request, self.target);
        self.service.call(request)
    }
}

The above log implementation is decoupled from the underlying protocol and is also decoupled from client or server concerns. In other words, the same log middleware could be used in either a client or a server.

Required Associated Types§

Source

type Service

The wrapped service

Required Methods§

Source

fn layer(&self, inner: S) -> Self::Service

Wrap the given service with the middleware, returning a new service that has been decorated with the middleware.

Implementations on Foreign Types§

Source§

impl<'a, T, S> Layer<S> for &'a T
where T: ?Sized + Layer<S>,

Source§

type Service = <T as Layer<S>>::Service

Source§

fn layer(&self, inner: S) -> Self::Service

Source§

impl<S> Layer<S> for ()

Source§

type Service = S

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1> Layer<S> for (L1,)
where L1: Layer<S>,

Source§

type Service = <L1 as Layer<S>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2> Layer<S> for (L1, L2)
where L1: Layer<L2::Service>, L2: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<S>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3> Layer<S> for (L1, L2, L3)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<S>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3, L4> Layer<S> for (L1, L2, L3, L4)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<L4::Service>, L4: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<<L4 as Layer<S>>::Service>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3, L4, L5> Layer<S> for (L1, L2, L3, L4, L5)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<L4::Service>, L4: Layer<L5::Service>, L5: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<<L4 as Layer<<L5 as Layer<S>>::Service>>::Service>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3, L4, L5, L6> Layer<S> for (L1, L2, L3, L4, L5, L6)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<L4::Service>, L4: Layer<L5::Service>, L5: Layer<L6::Service>, L6: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<<L4 as Layer<<L5 as Layer<<L6 as Layer<S>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3, L4, L5, L6, L7> Layer<S> for (L1, L2, L3, L4, L5, L6, L7)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<L4::Service>, L4: Layer<L5::Service>, L5: Layer<L6::Service>, L6: Layer<L7::Service>, L7: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<<L4 as Layer<<L5 as Layer<<L6 as Layer<<L7 as Layer<S>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3, L4, L5, L6, L7, L8> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<L4::Service>, L4: Layer<L5::Service>, L5: Layer<L6::Service>, L6: Layer<L7::Service>, L7: Layer<L8::Service>, L8: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<<L4 as Layer<<L5 as Layer<<L6 as Layer<<L7 as Layer<<L8 as Layer<S>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8, L9)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<L4::Service>, L4: Layer<L5::Service>, L5: Layer<L6::Service>, L6: Layer<L7::Service>, L7: Layer<L8::Service>, L8: Layer<L9::Service>, L9: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<<L4 as Layer<<L5 as Layer<<L6 as Layer<<L7 as Layer<<L8 as Layer<<L9 as Layer<S>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<L4::Service>, L4: Layer<L5::Service>, L5: Layer<L6::Service>, L6: Layer<L7::Service>, L7: Layer<L8::Service>, L8: Layer<L9::Service>, L9: Layer<L10::Service>, L10: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<<L4 as Layer<<L5 as Layer<<L6 as Layer<<L7 as Layer<<L8 as Layer<<L9 as Layer<<L10 as Layer<S>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<L4::Service>, L4: Layer<L5::Service>, L5: Layer<L6::Service>, L6: Layer<L7::Service>, L7: Layer<L8::Service>, L8: Layer<L9::Service>, L9: Layer<L10::Service>, L10: Layer<L11::Service>, L11: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<<L4 as Layer<<L5 as Layer<<L6 as Layer<<L7 as Layer<<L8 as Layer<<L9 as Layer<<L10 as Layer<<L11 as Layer<S>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<L4::Service>, L4: Layer<L5::Service>, L5: Layer<L6::Service>, L6: Layer<L7::Service>, L7: Layer<L8::Service>, L8: Layer<L9::Service>, L9: Layer<L10::Service>, L10: Layer<L11::Service>, L11: Layer<L12::Service>, L12: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<<L4 as Layer<<L5 as Layer<<L6 as Layer<<L7 as Layer<<L8 as Layer<<L9 as Layer<<L10 as Layer<<L11 as Layer<<L12 as Layer<S>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<L4::Service>, L4: Layer<L5::Service>, L5: Layer<L6::Service>, L6: Layer<L7::Service>, L7: Layer<L8::Service>, L8: Layer<L9::Service>, L9: Layer<L10::Service>, L10: Layer<L11::Service>, L11: Layer<L12::Service>, L12: Layer<L13::Service>, L13: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<<L4 as Layer<<L5 as Layer<<L6 as Layer<<L7 as Layer<<L8 as Layer<<L9 as Layer<<L10 as Layer<<L11 as Layer<<L12 as Layer<<L13 as Layer<S>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<L4::Service>, L4: Layer<L5::Service>, L5: Layer<L6::Service>, L6: Layer<L7::Service>, L7: Layer<L8::Service>, L8: Layer<L9::Service>, L9: Layer<L10::Service>, L10: Layer<L11::Service>, L11: Layer<L12::Service>, L12: Layer<L13::Service>, L13: Layer<L14::Service>, L14: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<<L4 as Layer<<L5 as Layer<<L6 as Layer<<L7 as Layer<<L8 as Layer<<L9 as Layer<<L10 as Layer<<L11 as Layer<<L12 as Layer<<L13 as Layer<<L14 as Layer<S>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<L4::Service>, L4: Layer<L5::Service>, L5: Layer<L6::Service>, L6: Layer<L7::Service>, L7: Layer<L8::Service>, L8: Layer<L9::Service>, L9: Layer<L10::Service>, L10: Layer<L11::Service>, L11: Layer<L12::Service>, L12: Layer<L13::Service>, L13: Layer<L14::Service>, L14: Layer<L15::Service>, L15: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<<L4 as Layer<<L5 as Layer<<L6 as Layer<<L7 as Layer<<L8 as Layer<<L9 as Layer<<L10 as Layer<<L11 as Layer<<L12 as Layer<<L13 as Layer<<L14 as Layer<<L15 as Layer<S>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Source§

impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16)
where L1: Layer<L2::Service>, L2: Layer<L3::Service>, L3: Layer<L4::Service>, L4: Layer<L5::Service>, L5: Layer<L6::Service>, L6: Layer<L7::Service>, L7: Layer<L8::Service>, L8: Layer<L9::Service>, L9: Layer<L10::Service>, L10: Layer<L11::Service>, L11: Layer<L12::Service>, L12: Layer<L13::Service>, L13: Layer<L14::Service>, L14: Layer<L15::Service>, L15: Layer<L16::Service>, L16: Layer<S>,

Source§

type Service = <L1 as Layer<<L2 as Layer<<L3 as Layer<<L4 as Layer<<L5 as Layer<<L6 as Layer<<L7 as Layer<<L8 as Layer<<L9 as Layer<<L10 as Layer<<L11 as Layer<<L12 as Layer<<L13 as Layer<<L14 as Layer<<L15 as Layer<<L16 as Layer<S>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service>>::Service

Source§

fn layer(&self, service: S) -> Self::Service

Implementors§

Source§

impl<F, S, Out> Layer<S> for LayerFn<F>
where F: Fn(S) -> Out,

Source§

type Service = Out

Source§

impl<S> Layer<S> for Identity

Decorates a Service, transforming either the request or the response.

Source§

impl<S, Inner, Outer> Layer<S> for Stack<Inner, Outer>
where Inner: Layer<S>, Outer: Layer<Inner::Service>,

Source§

type Service = <Outer as Layer<<Inner as Layer<S>>::Service>>::Service