Trait tower::Layer[][src]

pub trait Layer<S> {
    type Service;
    pub fn layer(&self, inner: S) -> Self::Service;
}

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.

Associated Types

type Service[src]

The wrapped service

Loading content...

Required methods

pub fn layer(&self, inner: S) -> Self::Service[src]

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

Loading content...

Implementations on Foreign Types

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

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

Loading content...

Implementors

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

type Service = Out

impl<In, T, U, E> Layer<In> for BoxLayer<In, T, U, E>[src]

This is supported on crate feature util only.

type Service = BoxService<T, U, E>

impl<P, S> Layer<S> for RetryLayer<P> where
    P: Clone
[src]

This is supported on crate feature retry only.

type Service = Retry<P, S>

impl<S> Layer<S> for Identity[src]

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

type Service = S

impl<S> Layer<S> for ConcurrencyLimitLayer[src]

This is supported on crate feature limit only.

type Service = ConcurrencyLimit<S>

impl<S> Layer<S> for RateLimitLayer[src]

This is supported on crate feature limit only.

type Service = RateLimit<S>

impl<S> Layer<S> for LoadShedLayer[src]

This is supported on crate feature load-shed only.

type Service = LoadShed<S>

impl<S> Layer<S> for SpawnReadyLayer[src]

This is supported on crate feature spawn-ready only.

type Service = MakeSpawnReady<S>

impl<S> Layer<S> for TimeoutLayer[src]

This is supported on crate feature timeout only.

type Service = Timeout<S>

impl<S, A, B> Layer<S> for Either<A, B> where
    A: Layer<S>,
    B: Layer<S>, 
[src]

This is supported on crate feature util only.

type Service = Either<A::Service, B::Service>

impl<S, F> Layer<S> for AndThenLayer<F> where
    F: Clone
[src]

This is supported on crate feature util only.

type Service = AndThen<S, F>

impl<S, F> Layer<S> for MapErrLayer<F> where
    F: Clone
[src]

This is supported on crate feature util only.

type Service = MapErr<S, F>

impl<S, F> Layer<S> for MapFutureLayer<F> where
    F: Clone
[src]

This is supported on crate feature util only.

type Service = MapFuture<S, F>

impl<S, F> Layer<S> for MapRequestLayer<F> where
    F: Clone
[src]

This is supported on crate feature util only.

type Service = MapRequest<S, F>

impl<S, F> Layer<S> for MapResponseLayer<F> where
    F: Clone
[src]

This is supported on crate feature util only.

type Service = MapResponse<S, F>

impl<S, F> Layer<S> for MapResultLayer<F> where
    F: Clone
[src]

This is supported on crate feature util only.

type Service = MapResult<S, F>

impl<S, F> Layer<S> for ThenLayer<F> where
    F: Clone
[src]

This is supported on crate feature util only.

type Service = Then<S, F>

impl<S, Inner, Outer> Layer<S> for Stack<Inner, Outer> where
    Inner: Layer<S>,
    Outer: Layer<<Inner as Layer<S>>::Service>, 
[src]

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

impl<S, Req> Layer<S> for MakeBalanceLayer<S, Req>[src]

This is supported on crate feature balance only.

type Service = MakeBalance<S, Req>

impl<S, Request> Layer<S> for BufferLayer<Request> where
    S: Service<Request> + Send + 'static,
    S::Future: Send,
    S::Error: Into<BoxError> + Send + Sync,
    Request: Send + 'static, 
[src]

This is supported on crate feature buffer only.

type Service = Buffer<S, Request>

impl<U: Clone, S> Layer<S> for AsyncFilterLayer<U>[src]

This is supported on crate feature filter only.

type Service = AsyncFilter<S, U>

impl<U: Clone, S> Layer<S> for FilterLayer<U>[src]

This is supported on crate feature filter only.

type Service = Filter<S, U>

Loading content...