luminal_router/service/
builder.rs1use hyper::{self, Method};
3use hyper::server::{self, Request, Response, Service};
4
5use std::collections::HashMap;
6
7use LuminalFuture;
8use error::*;
9use super::Router;
10
11pub struct ServiceRouteBuilder {
15 pub router: Router,
16}
17
18impl ServiceRouteBuilder {
19 pub fn new() -> ServiceRouteBuilder {
21 ServiceRouteBuilder {
22 router: Router {
23 routes: HashMap::new(),
24 },
25 }
26 }
27
28 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 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 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 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}