ft_sdk/from_request/
wrapped_processor.rs

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
41// why is the first element in all these, e.g. WrappedHandler<((), T), O> a ()? If we remove
42// () from it, we start getting compilation error.
43impl<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        // TODO: try to parse both t1 and t2 and return result for both together to clients
63        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        // TODO: try to parse both t1 and t2 and return result for both together to clients
78        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        // TODO: try to parse both t1 and t2 and return result for both together to clients
94        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        // TODO: try to parse both t1 and t2 and return result for both together to clients
116        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        // TODO: try to parse both t1 and t2 and return result for both together to clients
140        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}