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}