1use std::future::Future;
2
3pub trait Handler<Args>: Send + 'static {
4 type Output;
5 type Future: Future<Output = Self::Output>;
6 fn call(&self, req: Args) -> Self::Future;
7}
8
9macro_rules! factory_tuple ({ $($param:ident)* } => {
10 impl<Func, Fut, $($param,)*> Handler<($($param,)*)> for Func
11 where
12 Func: Fn($($param),*) -> Fut + Send + 'static,
13 Fut: Future + Send,
14 {
15 type Output = Fut::Output;
16 type Future = Fut;
17
18 #[inline]
19 #[allow(non_snake_case)]
20 fn call(&self, ($($param,)*): ($($param,)*)) -> Self::Future {
21 (self)($($param,)*)
22 }
23 }
24});
25factory_tuple! {}
40factory_tuple! { A }
41factory_tuple! { A B }
42factory_tuple! { A B C }
43factory_tuple! { A B C D }
44factory_tuple! { A B C D E }
45factory_tuple! { A B C D E F }
46factory_tuple! { A B C D E F I }
47factory_tuple! { A B C D E F I J }
48factory_tuple! { A B C D E F I J K }
49factory_tuple! { A B C D E F I J K L }