handler.rs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. use std::{
  2. future::Future,
  3. marker::PhantomData,
  4. pin::Pin,
  5. task::{Context, Poll},
  6. };
  7. use futures_core::ready;
  8. use pin_project::pin_project;
  9. use crate::{
  10. errors::DispatchError,
  11. request::{payload::Payload, EventRequest, FromRequest},
  12. response::{EventResponse, Responder},
  13. service::{Service, ServiceFactory, ServiceRequest, ServiceResponse},
  14. util::ready::*,
  15. };
  16. pub trait Handler<T, R>: Clone + 'static + Sync + Send
  17. where
  18. R: Future + Send + Sync,
  19. R::Output: Responder,
  20. {
  21. fn call(&self, param: T) -> R;
  22. }
  23. pub struct HandlerService<H, T, R>
  24. where
  25. H: Handler<T, R>,
  26. T: FromRequest,
  27. R: Future + Sync + Send,
  28. R::Output: Responder,
  29. {
  30. handler: H,
  31. _phantom: PhantomData<(T, R)>,
  32. }
  33. impl<H, T, R> HandlerService<H, T, R>
  34. where
  35. H: Handler<T, R>,
  36. T: FromRequest,
  37. R: Future + Sync + Send,
  38. R::Output: Responder,
  39. {
  40. pub fn new(handler: H) -> Self {
  41. Self {
  42. handler,
  43. _phantom: PhantomData,
  44. }
  45. }
  46. }
  47. impl<H, T, R> Clone for HandlerService<H, T, R>
  48. where
  49. H: Handler<T, R>,
  50. T: FromRequest,
  51. R: Future + Sync + Send,
  52. R::Output: Responder,
  53. {
  54. fn clone(&self) -> Self {
  55. Self {
  56. handler: self.handler.clone(),
  57. _phantom: PhantomData,
  58. }
  59. }
  60. }
  61. impl<F, T, R> ServiceFactory<ServiceRequest> for HandlerService<F, T, R>
  62. where
  63. F: Handler<T, R>,
  64. T: FromRequest,
  65. R: Future + Send + Sync,
  66. R::Output: Responder,
  67. {
  68. type Response = ServiceResponse;
  69. type Error = DispatchError;
  70. type Service = Self;
  71. type Context = ();
  72. type Future = Ready<Result<Self::Service, Self::Error>>;
  73. fn new_service(&self, _: ()) -> Self::Future {
  74. ready(Ok(self.clone()))
  75. }
  76. }
  77. impl<H, T, R> Service<ServiceRequest> for HandlerService<H, T, R>
  78. where
  79. H: Handler<T, R>,
  80. T: FromRequest,
  81. R: Future + Sync + Send,
  82. R::Output: Responder,
  83. {
  84. type Response = ServiceResponse;
  85. type Error = DispatchError;
  86. type Future = HandlerServiceFuture<H, T, R>;
  87. fn call(&self, req: ServiceRequest) -> Self::Future {
  88. let (req, mut payload) = req.into_parts();
  89. let fut = T::from_request(&req, &mut payload);
  90. HandlerServiceFuture::Extract(fut, Some(req), self.handler.clone())
  91. }
  92. }
  93. #[pin_project(project = HandlerServiceProj)]
  94. pub enum HandlerServiceFuture<H, T, R>
  95. where
  96. H: Handler<T, R>,
  97. T: FromRequest,
  98. R: Future + Sync + Send,
  99. R::Output: Responder,
  100. {
  101. Extract(#[pin] T::Future, Option<EventRequest>, H),
  102. Handle(#[pin] R, Option<EventRequest>),
  103. }
  104. impl<F, T, R> Future for HandlerServiceFuture<F, T, R>
  105. where
  106. F: Handler<T, R>,
  107. T: FromRequest,
  108. R: Future + Sync + Send,
  109. R::Output: Responder,
  110. {
  111. type Output = Result<ServiceResponse, DispatchError>;
  112. fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
  113. loop {
  114. match self.as_mut().project() {
  115. HandlerServiceProj::Extract(fut, req, handle) => {
  116. match ready!(fut.poll(cx)) {
  117. Ok(params) => {
  118. let fut = handle.call(params);
  119. let state = HandlerServiceFuture::Handle(fut, req.take());
  120. self.as_mut().set(state);
  121. }
  122. Err(err) => {
  123. let req = req.take().unwrap();
  124. let system_err: DispatchError = err.into();
  125. let res: EventResponse = system_err.into();
  126. return Poll::Ready(Ok(ServiceResponse::new(req, res)));
  127. }
  128. };
  129. }
  130. HandlerServiceProj::Handle(fut, req) => {
  131. let result = ready!(fut.poll(cx));
  132. let req = req.take().unwrap();
  133. let resp = result.respond_to(&req);
  134. return Poll::Ready(Ok(ServiceResponse::new(req, resp)));
  135. }
  136. }
  137. }
  138. }
  139. }
  140. macro_rules! factory_tuple ({ $($param:ident)* } => {
  141. impl<Func, $($param,)* Res> Handler<($($param,)*), Res> for Func
  142. where Func: Fn($($param),*) -> Res + Clone + 'static + Sync + Send,
  143. Res: Future + Sync + Send,
  144. Res::Output: Responder,
  145. {
  146. #[allow(non_snake_case)]
  147. fn call(&self, ($($param,)*): ($($param,)*)) -> Res {
  148. (self)($($param,)*)
  149. }
  150. }
  151. });
  152. macro_rules! tuple_from_req ({$tuple_type:ident, $(($n:tt, $T:ident)),+} => {
  153. #[allow(non_snake_case)]
  154. mod $tuple_type {
  155. use super::*;
  156. #[pin_project::pin_project]
  157. struct FromRequestFutures<$($T: FromRequest),+>($(#[pin] $T::Future),+);
  158. /// FromRequest implementation for tuple
  159. #[doc(hidden)]
  160. #[allow(unused_parens)]
  161. impl<$($T: FromRequest + 'static),+> FromRequest for ($($T,)+)
  162. {
  163. type Error = DispatchError;
  164. type Future = $tuple_type<$($T),+>;
  165. fn from_request(req: &EventRequest, payload: &mut Payload) -> Self::Future {
  166. $tuple_type {
  167. items: <($(Option<$T>,)+)>::default(),
  168. futs: FromRequestFutures($($T::from_request(req, payload),)+),
  169. }
  170. }
  171. }
  172. #[doc(hidden)]
  173. #[pin_project::pin_project]
  174. pub struct $tuple_type<$($T: FromRequest),+> {
  175. items: ($(Option<$T>,)+),
  176. #[pin]
  177. futs: FromRequestFutures<$($T,)+>,
  178. }
  179. impl<$($T: FromRequest),+> Future for $tuple_type<$($T),+>
  180. {
  181. type Output = Result<($($T,)+), DispatchError>;
  182. fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
  183. let mut this = self.project();
  184. let mut ready = true;
  185. $(
  186. if this.items.$n.is_none() {
  187. match this.futs.as_mut().project().$n.poll(cx) {
  188. Poll::Ready(Ok(item)) => this.items.$n = Some(item),
  189. Poll::Pending => ready = false,
  190. Poll::Ready(Err(e)) => return Poll::Ready(Err(e.into())),
  191. }
  192. }
  193. )+
  194. if ready {
  195. Poll::Ready(Ok(
  196. ($(this.items.$n.take().unwrap(),)+)
  197. ))
  198. } else {
  199. Poll::Pending
  200. }
  201. }
  202. }
  203. }
  204. });
  205. factory_tuple! {}
  206. factory_tuple! { A }
  207. factory_tuple! { A B }
  208. factory_tuple! { A B C }
  209. factory_tuple! { A B C D }
  210. factory_tuple! { A B C D E }
  211. #[rustfmt::skip]
  212. mod m {
  213. use super::*;
  214. tuple_from_req!(TupleFromRequest1, (0, A));
  215. tuple_from_req!(TupleFromRequest2, (0, A), (1, B));
  216. tuple_from_req!(TupleFromRequest3, (0, A), (1, B), (2, C));
  217. tuple_from_req!(TupleFromRequest4, (0, A), (1, B), (2, C), (3, D));
  218. tuple_from_req!(TupleFromRequest5, (0, A), (1, B), (2, C), (3, D), (4, E));
  219. }