1use std::collections::HashMap;
2
3use crate::request::ApiParamExtractor;
4use crate::{
5 request::ApiRequest,
6 response::{ApiResponse, ApiResultExtractor},
7};
8use std::future::Future;
9
10use super::ty::ApiModel;
11
12pub trait ApiAsyncHandler<T> {
13 fn get_request(models: &mut HashMap<String, Option<ApiModel>>) -> ApiRequest;
14
15 fn get_response(models: &mut HashMap<String, Option<ApiModel>>) -> ApiResponse;
16}
17
18impl<F, Fut, Res> ApiAsyncHandler<()> for F
19where
20 F: FnOnce() -> Fut + Clone + Send + 'static,
21 Fut: Future<Output = Res> + Send,
22 Res: ApiResultExtractor,
23{
24 fn get_request(_models: &mut HashMap<String, Option<ApiModel>>) -> ApiRequest {
25 ApiRequest::default()
26 }
27
28 fn get_response(models: &mut HashMap<String, Option<ApiModel>>) -> ApiResponse {
29 Res::api_response(models)
30 }
31}
32
33macro_rules! impl_async_handler {
34 (
35 [$($ty:ident),*]
36 ) => {
37 impl<F, Fut, Res, $($ty,)*> ApiAsyncHandler<($($ty,)*)> for F
38 where
39 F: FnOnce($($ty,)*) -> Fut + Clone + Send + 'static,
40 Fut: Future<Output = Res> + Send,
41 Res: ApiResultExtractor,
42 $( $ty: ApiParamExtractor, )*
43 {
44 fn get_request(models: &mut HashMap<String, Option<ApiModel>>) -> ApiRequest {
45 let mut request = ApiRequest::default();
46 $(
47 let param = $ty :: api_param_kind(models);
48 request.add_param(param);
49 let errors = $ty :: api_error();
50 request.add_error(errors);
51 )*
52
53 request
54 }
55
56 fn get_response(models: &mut HashMap<String, Option<ApiModel>>) -> ApiResponse {
57 Res::api_response(models)
58 }
59 }
60 };
61}
62
63macro_rules! all_the_tuples {
64 ($name:ident) => {
65 $name!([T1]);
66 $name!([T1, T2]);
67 $name!([T1, T2, T3]);
68 $name!([T1, T2, T3, T4]);
69 $name!([T1, T2, T3, T4, T5]);
70 $name!([T1, T2, T3, T4, T5, T6]);
71 $name!([T1, T2, T3, T4, T5, T6, T7]);
72 $name!([T1, T2, T3, T4, T5, T6, T7, T8]);
73 $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9]);
74 $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]);
75 $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11]);
76 $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12]);
77 $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13]);
78 $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14]);
79 $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15]);
80 $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16]);
81 };
82}
83
84all_the_tuples!(impl_async_handler);