Trait tower::Layer [−][src]
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.
Associated Types
Required methods
Implementations on Foreign Types
Implementors
impl<In, T, U, E> Layer<In> for BoxLayer<In, T, U, E>
[src]
impl<In, T, U, E> Layer<In> for BoxLayer<In, T, U, E>
[src]This is supported on crate feature
util
only.impl<P, S> Layer<S> for RetryLayer<P> where
P: Clone,
[src]
impl<P, S> Layer<S> for RetryLayer<P> where
P: Clone,
[src]This is supported on crate feature
retry
only.impl<S> Layer<S> for Identity
[src]
impl<S> Layer<S> for Identity
[src]Decorates a Service
, transforming either the request or the response.
impl<S> Layer<S> for RateLimitLayer
[src]
impl<S> Layer<S> for RateLimitLayer
[src]This is supported on crate feature
limit
only.impl<S> Layer<S> for LoadShedLayer
[src]
impl<S> Layer<S> for LoadShedLayer
[src]This is supported on crate feature
load-shed
only.impl<S> Layer<S> for TimeoutLayer
[src]
impl<S> Layer<S> for TimeoutLayer
[src]This is supported on crate feature
timeout
only.impl<S, A, B> Layer<S> for Either<A, B> where
A: Layer<S>,
B: Layer<S>,
[src]
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.impl<S, F> Layer<S> for AndThenLayer<F> where
F: Clone,
[src]
impl<S, F> Layer<S> for AndThenLayer<F> where
F: Clone,
[src]This is supported on crate feature
util
only.impl<S, F> Layer<S> for MapErrLayer<F> where
F: Clone,
[src]
impl<S, F> Layer<S> for MapErrLayer<F> where
F: Clone,
[src]This is supported on crate feature
util
only.impl<S, F> Layer<S> for MapFutureLayer<F> where
F: Clone,
[src]
impl<S, F> Layer<S> for MapFutureLayer<F> where
F: Clone,
[src]This is supported on crate feature
util
only.impl<S, F> Layer<S> for MapRequestLayer<F> where
F: Clone,
[src]
impl<S, F> Layer<S> for MapRequestLayer<F> where
F: Clone,
[src]This is supported on crate feature
util
only.impl<S, F> Layer<S> for MapResponseLayer<F> where
F: Clone,
[src]
impl<S, F> Layer<S> for MapResponseLayer<F> where
F: Clone,
[src]This is supported on crate feature
util
only.impl<S, F> Layer<S> for MapResultLayer<F> where
F: Clone,
[src]
impl<S, F> Layer<S> for MapResultLayer<F> where
F: Clone,
[src]This is supported on crate feature
util
only.impl<S, F> Layer<S> for ThenLayer<F> where
F: Clone,
[src]
impl<S, F> Layer<S> for ThenLayer<F> where
F: Clone,
[src]This is supported on crate feature
util
only.impl<S, Inner, Outer> Layer<S> for Stack<Inner, Outer> where
Inner: Layer<S>,
Outer: Layer<<Inner as Layer<S>>::Service>,
[src]
impl<S, Inner, Outer> Layer<S> for Stack<Inner, Outer> where
Inner: Layer<S>,
Outer: Layer<<Inner as Layer<S>>::Service>,
[src]impl<S, Req> Layer<S> for MakeBalanceLayer<S, Req>
[src]
impl<S, Req> Layer<S> for MakeBalanceLayer<S, Req>
[src]This is supported on crate feature
balance
only.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]
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.impl<U: Clone, S> Layer<S> for AsyncFilterLayer<U>
[src]
impl<U: Clone, S> Layer<S> for AsyncFilterLayer<U>
[src]This is supported on crate feature
filter
only.