1pub fn handle<T, O: Into<Result<http::Response<bytes::Bytes>, ft_sdk::Error>>, H: Handler<T, O>>(
4 h: H,
5) {
6 let req = match current_request() {
7 Ok(v) => v,
8 Err(e) => {
9 ft_sdk::println!("Error parsing request: {:?}", e);
10 ft_sdk::error::handle_error(e);
11 return;
12 }
13 };
14 let resp = h.call(&req).and_then(Into::into).unwrap_or_else(|e| {
15 ft_sdk::println!("Error: {:?}", e);
16 ft_sdk::error::handle_error(e)
17 });
18 ft_sdk::http::send_response(resp);
19}
20
21pub fn current_request() -> Result<http::Request<serde_json::Value>, ft_sdk::Error> {
22 let r = ft_sys::http::current_request();
23 let (h, b) = r.into_parts();
24 if b.as_ref() == b"" {
25 return Ok(http::Request::from_parts(h, serde_json::Value::Null));
26 }
27 let b = serde_json::from_slice(&b)?;
29 Ok(http::Request::from_parts(h, b))
30}
31
32pub trait Handler<T, O>: Sized {
33 fn call(self, req: &http::Request<serde_json::Value>) -> Result<O, ft_sdk::Error>;
34}
35
36impl<F, O> Handler<(), O> for F
37where
38 F: Fn() -> Result<O, ft_sdk::Error>,
39{
40 fn call(self, _req: &http::Request<serde_json::Value>) -> Result<O, ft_sdk::Error> {
41 (self)()
42 }
43}
44
45impl<F, T, O> Handler<T, O> for F
46where
47 F: Fn(T) -> Result<O, ft_sdk::Error>,
48 T: ft_sdk::FromRequest,
49{
50 fn call(self, req: &http::Request<serde_json::Value>) -> Result<O, ft_sdk::Error> {
51 (self)(T::from_request(req)?)
52 }
53}
54
55impl<F, T1, T2, O> Handler<(T1, T2), O> for F
56where
57 F: Fn(T1, T2) -> Result<O, ft_sdk::Error>,
58 T1: ft_sdk::FromRequest,
59 T2: ft_sdk::FromRequest,
60{
61 fn call(self, req: &http::Request<serde_json::Value>) -> Result<O, ft_sdk::Error> {
62 (self)(T1::from_request(req)?, T2::from_request(req)?)
64 }
65}
66
67impl<F, T1, T2, T3, O> Handler<(T1, T2, T3), O> for F
68where
69 F: Fn(T1, T2, T3) -> Result<O, ft_sdk::Error>,
70 T1: ft_sdk::FromRequest,
71 T2: ft_sdk::FromRequest,
72 T3: ft_sdk::FromRequest,
73{
74 fn call(self, req: &http::Request<serde_json::Value>) -> Result<O, ft_sdk::Error> {
75 (self)(
77 T1::from_request(req)?,
78 T2::from_request(req)?,
79 T3::from_request(req)?,
80 )
81 }
82}
83
84impl<F, T1, T2, T3, T4, O> Handler<(T1, T2, T3, T4), O> for F
85where
86 F: Fn(T1, T2, T3, T4) -> Result<O, ft_sdk::Error>,
87 T1: ft_sdk::FromRequest,
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>) -> Result<O, ft_sdk::Error> {
93 (self)(
95 T1::from_request(req)?,
96 T2::from_request(req)?,
97 T3::from_request(req)?,
98 T4::from_request(req)?,
99 )
100 }
101}
102
103impl<F, T1, T2, T3, T4, T5, O> Handler<(T1, T2, T3, T4, T5), O> for F
104where
105 F: Fn(T1, T2, T3, T4, T5) -> Result<O, ft_sdk::Error>,
106 T1: ft_sdk::FromRequest,
107 T2: ft_sdk::FromRequest,
108 T3: ft_sdk::FromRequest,
109 T4: ft_sdk::FromRequest,
110 T5: ft_sdk::FromRequest,
111{
112 fn call(self, req: &http::Request<serde_json::Value>) -> Result<O, ft_sdk::Error> {
113 (self)(
115 T1::from_request(req)?,
116 T2::from_request(req)?,
117 T3::from_request(req)?,
118 T4::from_request(req)?,
119 T5::from_request(req)?,
120 )
121 }
122}
123
124impl<F, T1, T2, T3, T4, T5, T6, O> Handler<(T1, T2, T3, T4, T5, T6), O> for F
125where
126 F: Fn(T1, T2, T3, T4, T5, T6) -> Result<O, ft_sdk::Error>,
127 T1: ft_sdk::FromRequest,
128 T2: ft_sdk::FromRequest,
129 T3: ft_sdk::FromRequest,
130 T4: ft_sdk::FromRequest,
131 T5: ft_sdk::FromRequest,
132 T6: ft_sdk::FromRequest,
133{
134 fn call(self, req: &http::Request<serde_json::Value>) -> Result<O, ft_sdk::Error> {
135 (self)(
137 T1::from_request(req)?,
138 T2::from_request(req)?,
139 T3::from_request(req)?,
140 T4::from_request(req)?,
141 T5::from_request(req)?,
142 T6::from_request(req)?,
143 )
144 }
145}
146
147impl<F, T1, T2, T3, T4, T5, T6, T7, O> Handler<(T1, T2, T3, T4, T5, T6, T7), O> for F
148where
149 F: Fn(T1, T2, T3, T4, T5, T6, T7) -> Result<O, ft_sdk::Error>,
150 T1: ft_sdk::FromRequest,
151 T2: ft_sdk::FromRequest,
152 T3: ft_sdk::FromRequest,
153 T4: ft_sdk::FromRequest,
154 T5: ft_sdk::FromRequest,
155 T6: ft_sdk::FromRequest,
156 T7: ft_sdk::FromRequest,
157{
158 fn call(self, req: &http::Request<serde_json::Value>) -> Result<O, ft_sdk::Error> {
159 (self)(
161 T1::from_request(req)?,
162 T2::from_request(req)?,
163 T3::from_request(req)?,
164 T4::from_request(req)?,
165 T5::from_request(req)?,
166 T6::from_request(req)?,
167 T7::from_request(req)?,
168 )
169 }
170}
171
172impl<F, T1, T2, T3, T4, T5, T6, T7, T8, O> Handler<(T1, T2, T3, T4, T5, T6, T7, T8), O> for F
173where
174 F: Fn(T1, T2, T3, T4, T5, T6, T7, T8) -> Result<O, ft_sdk::Error>,
175 T1: ft_sdk::FromRequest,
176 T2: ft_sdk::FromRequest,
177 T3: ft_sdk::FromRequest,
178 T4: ft_sdk::FromRequest,
179 T5: ft_sdk::FromRequest,
180 T6: ft_sdk::FromRequest,
181 T7: ft_sdk::FromRequest,
182 T8: ft_sdk::FromRequest,
183{
184 fn call(self, req: &http::Request<serde_json::Value>) -> Result<O, ft_sdk::Error> {
185 (self)(
187 T1::from_request(req)?,
188 T2::from_request(req)?,
189 T3::from_request(req)?,
190 T4::from_request(req)?,
191 T5::from_request(req)?,
192 T6::from_request(req)?,
193 T7::from_request(req)?,
194 T8::from_request(req)?,
195 )
196 }
197}
198
199impl<F, T1, T2, T3, T4, T5, T6, T7, T8, T9, O> Handler<(T1, T2, T3, T4, T5, T6, T7, T8, T9), O>
200 for F
201where
202 F: Fn(T1, T2, T3, T4, T5, T6, T7, T8, T9) -> Result<O, ft_sdk::Error>,
203 T1: ft_sdk::FromRequest,
204 T2: ft_sdk::FromRequest,
205 T3: ft_sdk::FromRequest,
206 T4: ft_sdk::FromRequest,
207 T5: ft_sdk::FromRequest,
208 T6: ft_sdk::FromRequest,
209 T7: ft_sdk::FromRequest,
210 T8: ft_sdk::FromRequest,
211 T9: ft_sdk::FromRequest,
212{
213 fn call(self, req: &http::Request<serde_json::Value>) -> Result<O, ft_sdk::Error> {
214 (self)(
216 T1::from_request(req)?,
217 T2::from_request(req)?,
218 T3::from_request(req)?,
219 T4::from_request(req)?,
220 T5::from_request(req)?,
221 T6::from_request(req)?,
222 T7::from_request(req)?,
223 T8::from_request(req)?,
224 T9::from_request(req)?,
225 )
226 }
227}
228
229impl<F, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, O>
230 Handler<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10), O> for F
231where
232 F: Fn(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> Result<O, ft_sdk::Error>,
233 T1: ft_sdk::FromRequest,
234 T2: ft_sdk::FromRequest,
235 T3: ft_sdk::FromRequest,
236 T4: ft_sdk::FromRequest,
237 T5: ft_sdk::FromRequest,
238 T6: ft_sdk::FromRequest,
239 T7: ft_sdk::FromRequest,
240 T8: ft_sdk::FromRequest,
241 T9: ft_sdk::FromRequest,
242 T10: ft_sdk::FromRequest,
243{
244 fn call(self, req: &http::Request<serde_json::Value>) -> Result<O, ft_sdk::Error> {
245 (self)(
247 T1::from_request(req)?,
248 T2::from_request(req)?,
249 T3::from_request(req)?,
250 T4::from_request(req)?,
251 T5::from_request(req)?,
252 T6::from_request(req)?,
253 T7::from_request(req)?,
254 T8::from_request(req)?,
255 T9::from_request(req)?,
256 T10::from_request(req)?,
257 )
258 }
259}
260
261impl<F, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, O>
262 Handler<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11), O> for F
263where
264 F: Fn(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> Result<O, ft_sdk::Error>,
265 T1: ft_sdk::FromRequest,
266 T2: ft_sdk::FromRequest,
267 T3: ft_sdk::FromRequest,
268 T4: ft_sdk::FromRequest,
269 T5: ft_sdk::FromRequest,
270 T6: ft_sdk::FromRequest,
271 T7: ft_sdk::FromRequest,
272 T8: ft_sdk::FromRequest,
273 T9: ft_sdk::FromRequest,
274 T10: ft_sdk::FromRequest,
275 T11: ft_sdk::FromRequest,
276{
277 fn call(self, req: &http::Request<serde_json::Value>) -> Result<O, ft_sdk::Error> {
278 (self)(
280 T1::from_request(req)?,
281 T2::from_request(req)?,
282 T3::from_request(req)?,
283 T4::from_request(req)?,
284 T5::from_request(req)?,
285 T6::from_request(req)?,
286 T7::from_request(req)?,
287 T8::from_request(req)?,
288 T9::from_request(req)?,
289 T10::from_request(req)?,
290 T11::from_request(req)?,
291 )
292 }
293}
294
295impl<F, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, O>
296 Handler<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12), O> for F
297where
298 F: Fn(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> Result<O, ft_sdk::Error>,
299 T1: ft_sdk::FromRequest,
300 T2: ft_sdk::FromRequest,
301 T3: ft_sdk::FromRequest,
302 T4: ft_sdk::FromRequest,
303 T5: ft_sdk::FromRequest,
304 T6: ft_sdk::FromRequest,
305 T7: ft_sdk::FromRequest,
306 T8: ft_sdk::FromRequest,
307 T9: ft_sdk::FromRequest,
308 T10: ft_sdk::FromRequest,
309 T11: ft_sdk::FromRequest,
310 T12: ft_sdk::FromRequest,
311{
312 fn call(self, req: &http::Request<serde_json::Value>) -> Result<O, ft_sdk::Error> {
313 (self)(
315 T1::from_request(req)?,
316 T2::from_request(req)?,
317 T3::from_request(req)?,
318 T4::from_request(req)?,
319 T5::from_request(req)?,
320 T6::from_request(req)?,
321 T7::from_request(req)?,
322 T8::from_request(req)?,
323 T9::from_request(req)?,
324 T10::from_request(req)?,
325 T11::from_request(req)?,
326 T12::from_request(req)?,
327 )
328 }
329}