apidoc_core/
handler.rs

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);