luminal_router/service/
builder.rs

1//! Builders to add implementations of `Service` and functions for specific methods and reoutes.
2use hyper::{self, Method};
3use hyper::server::{self, Request, Response, Service};
4
5use std::collections::HashMap;
6
7use LuminalFuture;
8use error::*;
9use super::Router;
10
11/// Fluent builder, takes ownership of a `Router` while adding routes.
12///
13/// Call `build` to move ownership of the route back out.
14pub struct ServiceRouteBuilder {
15    pub router: Router,
16}
17
18impl ServiceRouteBuilder {
19    /// Create a new instance with a `Router` with empty routes.
20    pub fn new() -> ServiceRouteBuilder {
21        ServiceRouteBuilder {
22            router: Router {
23                routes: HashMap::new(),
24            },
25        }
26    }
27
28    /// Add a service for `Method::Get` at the specified route.
29    pub fn get<
30        S: Service<
31            Request = Request,
32            Response = Response,
33            Error = hyper::Error,
34            Future = LuminalFuture,
35        >
36            + 'static,
37    >(
38        mut self,
39        route: &str,
40        service: S,
41    ) -> Result<Self> {
42        {
43            self.router.add(Method::Get, route, Box::new(service))?;
44        }
45        Ok(self)
46    }
47
48    /// Add a service for `Method::Post` at the specified route.
49    pub fn post<
50        S: Service<
51            Request = Request,
52            Response = Response,
53            Error = hyper::Error,
54            Future = LuminalFuture,
55        >
56            + 'static,
57    >(
58        mut self,
59        route: &str,
60        service: S,
61    ) -> Result<Self> {
62        {
63            self.router.add(Method::Post, route, Box::new(service))?;
64        }
65        Ok(self)
66    }
67
68    pub fn fn_builder(self) -> FnRouteBuilder {
69        FnRouteBuilder {
70            router: self.router,
71        }
72    }
73
74    /// Call to gain/regain ownership of the `Router`.
75    pub fn build(self) -> Router {
76        self.router
77    }
78}
79
80pub struct FnRouteBuilder {
81    pub router: Router,
82}
83
84impl FnRouteBuilder {
85    pub fn new() -> FnRouteBuilder {
86        FnRouteBuilder {
87            router: Router {
88                routes: HashMap::new(),
89            },
90        }
91    }
92
93    /// Add a service for `Method::Get` at the specified route.
94    pub fn get<F: Fn(Request) -> LuminalFuture + 'static>(
95        mut self,
96        route: &str,
97        function: F,
98    ) -> Result<Self> {
99        {
100            self.router
101                .add(Method::Get, route, Box::new(server::service_fn(function)))?;
102        }
103        Ok(self)
104    }
105
106    pub fn service_builder(self) -> ServiceRouteBuilder {
107        ServiceRouteBuilder {
108            router: self.router,
109        }
110    }
111
112    pub fn build(self) -> Router {
113        self.router
114    }
115}