gotham/pipeline/single.rs
1//! Defines helpers for applications that only require a single pipeline (i.e. only one set of
2//! middleware for the application).
3
4use borrow_bag::{Append, Handle};
5
6use super::{finalize_pipeline_set, new_pipeline_set, NewMiddlewareChain, Pipeline, PipelineSet};
7
8/// A `PipelineSet` which contains only a single pipeline.
9pub type SinglePipelineSet<C> = PipelineSet<<() as Append<Pipeline<C>>>::Output>;
10
11/// A `Handle` for borrowing the only pipeline from a `SinglePipelineSet`.
12pub type SinglePipelineHandle<C> = Handle<Pipeline<C>, <() as Append<Pipeline<C>>>::Navigator>;
13
14/// A pipeline chain which contains only the single pipeline in a `SinglePipelineSet`.
15pub type SinglePipelineChain<C> = (SinglePipelineHandle<C>, ());
16
17/// Creates a single pipeline for use in applications with straightforward use cases for
18/// middleware.
19///
20/// Returns instances of the required PipelineHandleChain and PipelineSet types ready for use with
21/// `build_router`.
22///
23/// # Examples
24///
25/// ```rust
26/// # extern crate gotham;
27/// # use gotham::pipeline::{new_pipeline, single_pipeline};
28/// # use gotham::router::builder::build_router;
29/// # use gotham::middleware::session::NewSessionMiddleware;
30/// # use serde::{Deserialize, Serialize};
31/// #
32/// # #[derive(Serialize, Deserialize, Default)]
33/// # struct Session;
34/// #
35/// # fn main() {
36/// let (chain, pipelines) = single_pipeline(
37/// new_pipeline()
38/// .add(NewSessionMiddleware::default().with_session_type::<Session>())
39/// .build(),
40/// );
41///
42/// build_router(chain, pipelines, |route| {
43/// // Implementation elided
44/// # _ = route;
45/// });
46/// # }
47/// ```
48pub fn single_pipeline<C>(c: Pipeline<C>) -> (SinglePipelineChain<C>, SinglePipelineSet<C>)
49where
50 C: NewMiddlewareChain,
51{
52 let pipelines = new_pipeline_set();
53 let (pipelines, single) = pipelines.add(c);
54 let pipelines = finalize_pipeline_set(pipelines);
55
56 let chain = (single, ());
57
58 (chain, pipelines)
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64
65 use crate::pipeline::new_pipeline;
66 use crate::router::builder::*;
67
68 #[test]
69 fn test_pipeline_construction() {
70 let (chain, pipelines) = single_pipeline(new_pipeline().build());
71
72 build_router(chain, pipelines, |_route| {});
73 }
74}