pub struct BoxLayer<In, T, U, E> { /* private fields */ }Expand description
A boxed Layer trait object.
BoxLayer turns a layer into a trait object, allowing both the Layer itself
and the output Service to be dynamic, while having consistent types.
This Layer produces BoxService instances erasing the type of the
Service produced by the wrapped Layer.
§Example
BoxLayer can, for example, be useful to create layers dynamically that otherwise wouldn’t have
the same types. In this example, we include a Timeout layer
only if an environment variable is set. We can use BoxLayer
to return a consistent type regardless of runtime configuration:
use std::time::Duration;
use tower::{Service, ServiceBuilder, BoxError, util::BoxLayer};
fn common_layer<S, T>() -> BoxLayer<S, T, S::Response, BoxError>
where
S: Service<T> + Send + 'static,
S::Future: Send + 'static,
S::Error: Into<BoxError> + 'static,
{
let builder = ServiceBuilder::new()
.concurrency_limit(100);
if std::env::var("SET_TIMEOUT").is_ok() {
let layer = builder
.timeout(Duration::from_secs(30))
.into_inner();
BoxLayer::new(layer)
} else {
let layer = builder
.map_err(Into::into)
.into_inner();
BoxLayer::new(layer)
}
}Implementations§
Trait Implementations§
Auto Trait Implementations§
impl<In, T, U, E> Freeze for BoxLayer<In, T, U, E>
impl<In, T, U, E> !RefUnwindSafe for BoxLayer<In, T, U, E>
impl<In, T, U, E> Send for BoxLayer<In, T, U, E>
impl<In, T, U, E> Sync for BoxLayer<In, T, U, E>
impl<In, T, U, E> Unpin for BoxLayer<In, T, U, E>
impl<In, T, U, E> !UnwindSafe for BoxLayer<In, T, U, E>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more