titan_core/
handler.rs

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});
25//impl<Func, Fut> Handler<((),)> for Func
26//where
27//  Func: Fn() -> Fut + Send + 'static,
28//  Fut: Future + Send,
29//{
30//  type Future = Fut;
31//  type Output = Fut::Output;
32//
33//  fn call(&self, req: ()) -> Self::Future {
34//    let _ = req;
35//    self()
36//  }
37//}
38
39factory_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 }