pub struct Pipeline<T> where
T: NewMiddlewareChain, { /* private fields */ }
Expand description
When using middleware, one or more Middleware
are combined to form a Pipeline
.
Middleware
are invoked strictly in the order they’re added to the Pipeline
.
At Request
dispatch time, the Middleware
are created from the NewMiddleware
values given
to the PipelineBuilder
, and combined with a Handler
created from the NewHandler
provided
to Pipeline::call
. These Middleware
and Handler
values are used for a single Request
.
Examples
#[derive(StateData)]
struct MiddlewareData {
vec: Vec<i32>
}
#[derive(NewMiddleware, Copy, Clone)]
struct MiddlewareOne;
impl Middleware for MiddlewareOne {
// Implementation elided.
// Appends `1` to `MiddlewareData.vec`
}
#[derive(NewMiddleware, Copy, Clone)]
struct MiddlewareTwo;
impl Middleware for MiddlewareTwo {
// Implementation elided.
// Appends `2` to `MiddlewareData.vec`
}
#[derive(NewMiddleware, Copy, Clone)]
struct MiddlewareThree;
impl Middleware for MiddlewareThree {
// Implementation elided.
// Appends `3` to `MiddlewareData.vec`
}
fn handler(state: State) -> (State, Response<Body>) {
let body = {
let data = state.borrow::<MiddlewareData>();
format!("{:?}", data.vec)
};
let res = create_response(&state,
StatusCode::OK,
mime::TEXT_PLAIN,
body);
(state, res)
}
fn main() {
let (chain, pipelines) = single_pipeline(
new_pipeline()
.add(MiddlewareOne)
.add(MiddlewareTwo)
.add(MiddlewareThree)
.build()
);
let router = build_router(chain, pipelines, |route| {
route.get("/").to(handler);
});
let test_server = TestServer::new(router).unwrap();
let response = test_server.client().get("http://example.com/").perform().unwrap();
assert_eq!(response.status(), StatusCode::OK);
assert_eq!(response.read_utf8_body().unwrap(), "[1, 2, 3]");
}
Auto Trait Implementations
impl<T> RefUnwindSafe for Pipeline<T>
impl<T> Send for Pipeline<T> where
T: Send,
impl<T> Sync for Pipeline<T> where
T: Sync,
impl<T> Unpin for Pipeline<T> where
T: Unpin,
impl<T> UnwindSafe for Pipeline<T> where
T: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcepub fn borrow_mut(&mut self) -> &mut T
pub fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Instruments this type with the provided Span
, returning an
Instrumented
wrapper. Read more
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
sourceimpl<T> WithSubscriber for T
impl<T> WithSubscriber for T
sourcefn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
Attaches the provided Subscriber
to this type, returning a
WithDispatch
wrapper. Read more
sourcefn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber
to this type, returning a
WithDispatch
wrapper. Read more