ft_sdk/from_request/
handler.rs

1// https://github.com/alexpusch/rust-magic-patterns/blob/master/axum-style-magic-function-param/Readme.md
2// https://joshchoo.com/writing/how-actix-web-app-state-and-data-extractor-works
3pub 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    // todo: what if content type is not application/json?
28    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        // TODO: try to parse both t1 and t2 and return result for both together to clients
63        (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        // TODO: try to parse both t1 and t2 and return result for both together to clients
76        (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        // TODO: try to parse both t1 and t2 and return result for both together to clients
94        (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        // TODO: try to parse both t1 and t2 and return result for both together to clients
114        (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        // TODO: try to parse both t1 and t2 and return result for both together to clients
136        (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        // TODO: try to parse both t1 and t2 and return result for both together to clients
160        (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        // TODO: try to parse both t1 and t2 and return result for both together to clients
186        (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        // TODO: try to parse both t1 and t2 and return result for both together to clients
215        (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        // TODO: try to parse both t1 and t2 and return result for both together to clients
246        (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        // TODO: try to parse both t1 and t2 and return result for both together to clients
279        (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        // TODO: try to parse both t1 and t2 and return result for both together to clients
314        (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}