1pub fn handle<T, H: WrappedHandler<T>>(h: H) {
2 let req = match ft_sdk::from_request::handler::current_request() {
3 Ok(v) => v,
4 Err(e) => {
5 ft_sdk::println!("Error parsing request: {:?}", e);
6 ft_sdk::error::handle_error(e);
7 return;
8 }
9 };
10 let resp = h.call(&req).and_then(Into::into).unwrap_or_else(|e| {
11 ft_sdk::println!("Error: {:?}", e);
12 ft_sdk::error::handle_error(e)
13 });
14 ft_sdk::http::send_response(resp);
15}
16
17pub trait WrappedHandler<T>: Sized {
18 fn call(self, req: &http::Request<serde_json::Value>) -> ft_sdk::processor::Result;
19}
20
21fn wrap<T: ft_sdk::WrappedFromRequest>(
22 t: T,
23 o: ft_sdk::chr::CHR<ft_sdk::processor::Output>,
24) -> ft_sdk::processor::Result {
25 let ft_sdk::chr::CHR {
26 cookies,
27 headers,
28 response,
29 } = o;
30 let response = match response {
31 ft_sdk::processor::Output::Json(j) => ft_sdk::processor::Output::Json(t.wrap(j)?),
32 _ => response,
33 };
34 Ok(ft_sdk::chr::CHR {
35 cookies,
36 headers,
37 response,
38 })
39}
40
41impl<F, T> WrappedHandler<((), T)> for F
44where
45 F: Fn(&mut T) -> ft_sdk::processor::Result,
46 T: ft_sdk::WrappedFromRequest,
47{
48 fn call(self, req: &http::Request<serde_json::Value>) -> ft_sdk::processor::Result {
49 let mut t = T::from_request(req)?;
50 let o = (self)(&mut t)?;
51 wrap(t, o)
52 }
53}
54
55impl<F, T1, T2> WrappedHandler<((), T1, T2)> for F
56where
57 F: Fn(&mut T1, T2) -> ft_sdk::processor::Result,
58 T1: ft_sdk::WrappedFromRequest,
59 T2: ft_sdk::FromRequest,
60{
61 fn call(self, req: &http::Request<serde_json::Value>) -> ft_sdk::processor::Result {
62 let mut t = T1::from_request(req)?;
64 let o = (self)(&mut t, T2::from_request(req)?)?;
65 wrap(t, o)
66 }
67}
68
69impl<F, T1, T2, T3> WrappedHandler<((), T1, T2, T3)> for F
70where
71 F: Fn(&mut T1, T2, T3) -> ft_sdk::processor::Result,
72 T1: ft_sdk::WrappedFromRequest,
73 T2: ft_sdk::FromRequest,
74 T3: ft_sdk::FromRequest,
75{
76 fn call(self, req: &http::Request<serde_json::Value>) -> ft_sdk::processor::Result {
77 let mut t = T1::from_request(req)?;
79 let o = (self)(&mut t, T2::from_request(req)?, T3::from_request(req)?)?;
80 wrap(t, o)
81 }
82}
83
84impl<F, T1, T2, T3, T4> WrappedHandler<((), T1, T2, T3, T4)> for F
85where
86 F: Fn(&mut T1, T2, T3, T4) -> ft_sdk::processor::Result,
87 T1: ft_sdk::WrappedFromRequest,
88 T2: ft_sdk::FromRequest,
89 T3: ft_sdk::FromRequest,
90 T4: ft_sdk::FromRequest,
91{
92 fn call(self, req: &http::Request<serde_json::Value>) -> ft_sdk::processor::Result {
93 let mut t = T1::from_request(req)?;
95 let o = (self)(
96 &mut t,
97 T2::from_request(req)?,
98 T3::from_request(req)?,
99 T4::from_request(req)?,
100 )?;
101 wrap(t, o)
102 }
103}
104
105impl<F, T1, T2, T3, T4, T5> WrappedHandler<((), T1, T2, T3, T4, T5)> for F
106where
107 F: Fn(&mut T1, T2, T3, T4, T5) -> ft_sdk::processor::Result,
108 T1: ft_sdk::WrappedFromRequest,
109 T2: ft_sdk::FromRequest,
110 T3: ft_sdk::FromRequest,
111 T4: ft_sdk::FromRequest,
112 T5: ft_sdk::FromRequest,
113{
114 fn call(self, req: &http::Request<serde_json::Value>) -> ft_sdk::processor::Result {
115 let mut t = T1::from_request(req)?;
117 let o = (self)(
118 &mut t,
119 T2::from_request(req)?,
120 T3::from_request(req)?,
121 T4::from_request(req)?,
122 T5::from_request(req)?,
123 )?;
124 wrap(t, o)
125 }
126}
127
128impl<F, T1, T2, T3, T4, T5, T6> WrappedHandler<((), T1, T2, T3, T4, T5, T6)> for F
129where
130 F: Fn(&mut T1, T2, T3, T4, T5, T6) -> ft_sdk::processor::Result,
131 T1: ft_sdk::WrappedFromRequest,
132 T2: ft_sdk::FromRequest,
133 T3: ft_sdk::FromRequest,
134 T4: ft_sdk::FromRequest,
135 T5: ft_sdk::FromRequest,
136 T6: ft_sdk::FromRequest,
137{
138 fn call(self, req: &http::Request<serde_json::Value>) -> ft_sdk::processor::Result {
139 let mut t = T1::from_request(req)?;
141 let o = (self)(
142 &mut t,
143 T2::from_request(req)?,
144 T3::from_request(req)?,
145 T4::from_request(req)?,
146 T5::from_request(req)?,
147 T6::from_request(req)?,
148 )?;
149 wrap(t, o)
150 }
151}