refactor(lib): use type macro to detect impl Trait
This commit is contained in:
		| @@ -238,12 +238,11 @@ where | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     #[cfg(impl_trait_available)] | ||||
|     pub(crate) fn send_request_retryable(&mut self, req: Request<B>) -> impl Future<Item = Response<Body>, Error = (::Error, Option<Request<B>>)> + Send | ||||
|     pub(crate) fn send_request_retryable(&mut self, req: Request<B>) -> impl_trait!(ty: Future<Item = Response<Body>, Error = (::Error, Option<Request<B>>)> + Send) | ||||
|     where | ||||
|         B: Send, | ||||
|     { | ||||
|         match self.dispatch.try_send(req) { | ||||
|         impl_trait!(e: match self.dispatch.try_send(req) { | ||||
|             Ok(rx) => { | ||||
|                 Either::A(rx.then(move |res| { | ||||
|                     match res { | ||||
| @@ -259,32 +258,7 @@ where | ||||
|                 let err = ::Error::new_canceled(Some("connection was not ready")); | ||||
|                 Either::B(future::err((err, Some(req)))) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     #[cfg(not(impl_trait_available))] | ||||
|     pub(super) fn send_request_retryable(&mut self, req: Request<B>) -> Box<Future<Item=Response<Body>, Error=(::Error, Option<Request<B>>)> + Send> | ||||
|     where | ||||
|         B: Send, | ||||
|     { | ||||
|         let inner = match self.dispatch.try_send(req) { | ||||
|             Ok(rx) => { | ||||
|                 Either::A(rx.then(move |res| { | ||||
|                     match res { | ||||
|                         Ok(Ok(res)) => Ok(res), | ||||
|                         Ok(Err(err)) => Err(err), | ||||
|                         // this is definite bug if it happens, but it shouldn't happen! | ||||
|                         Err(_) => panic!("dispatch dropped without returning error"), | ||||
|                     } | ||||
|                 })) | ||||
|             }, | ||||
|             Err(req) => { | ||||
|                 debug!("connection was not ready"); | ||||
|                 let err = ::Error::new_canceled(Some("connection was not ready")); | ||||
|                 Either::B(future::err((err, Some(req)))) | ||||
|             } | ||||
|         }; | ||||
|         Box::new(inner) | ||||
|         }) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -324,12 +298,11 @@ impl<B> Http2SendRequest<B> | ||||
| where | ||||
|     B: Payload + 'static, | ||||
| { | ||||
|     #[cfg(impl_trait_available)] | ||||
|     pub(super) fn send_request_retryable(&mut self, req: Request<B>) -> impl Future<Item=Response<Body>, Error=(::Error, Option<Request<B>>)> + Send | ||||
|     pub(super) fn send_request_retryable(&mut self, req: Request<B>) -> impl_trait!(ty: Future<Item=Response<Body>, Error=(::Error, Option<Request<B>>)> + Send) | ||||
|     where | ||||
|         B: Send, | ||||
|     { | ||||
|         match self.dispatch.try_send(req) { | ||||
|         impl_trait!(e: match self.dispatch.try_send(req) { | ||||
|             Ok(rx) => { | ||||
|                 Either::A(rx.then(move |res| { | ||||
|                     match res { | ||||
| @@ -345,32 +318,7 @@ where | ||||
|                 let err = ::Error::new_canceled(Some("connection was not ready")); | ||||
|                 Either::B(future::err((err, Some(req)))) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     #[cfg(not(impl_trait_available))] | ||||
|     pub(crate) fn send_request_retryable(&mut self, req: Request<B>) -> Box<Future<Item=Response<Body>, Error=(::Error, Option<Request<B>>)> + Send> | ||||
|     where | ||||
|         B: Send, | ||||
|     { | ||||
|         let inner = match self.dispatch.try_send(req) { | ||||
|             Ok(rx) => { | ||||
|                 Either::A(rx.then(move |res| { | ||||
|                     match res { | ||||
|                         Ok(Ok(res)) => Ok(res), | ||||
|                         Ok(Err(err)) => Err(err), | ||||
|                         // this is definite bug if it happens, but it shouldn't happen! | ||||
|                         Err(_) => panic!("dispatch dropped without returning error"), | ||||
|                     } | ||||
|                 })) | ||||
|             }, | ||||
|             Err(req) => { | ||||
|                 debug!("connection was not ready"); | ||||
|                 let err = ::Error::new_canceled(Some("connection was not ready")); | ||||
|                 Either::B(future::err((err, Some(req)))) | ||||
|             } | ||||
|         }; | ||||
|         Box::new(inner) | ||||
|         }) | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -623,26 +623,14 @@ impl<B> PoolClient<B> { | ||||
| } | ||||
|  | ||||
| impl<B: Payload + 'static> PoolClient<B> { | ||||
|     #[cfg(impl_trait_available)] | ||||
|     fn send_request_retryable(&mut self, req: Request<B>) -> impl Future<Item = Response<Body>, Error = (::Error, Option<Request<B>>)> + Send | ||||
|     fn send_request_retryable(&mut self, req: Request<B>) -> impl_trait!(ty: Future<Item = Response<Body>, Error = (::Error, Option<Request<B>>)> + Send) | ||||
|     where | ||||
|         B: Send, | ||||
|     { | ||||
|         match self.tx { | ||||
|         impl_trait!(e: match self.tx { | ||||
|             PoolTx::Http1(ref mut tx) => Either::A(tx.send_request_retryable(req)), | ||||
|             PoolTx::Http2(ref mut tx) => Either::B(tx.send_request_retryable(req)), | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     #[cfg(not(impl_trait_available))] | ||||
|     fn send_request_retryable(&mut self, req: Request<B>) -> Box<Future<Item=Response<Body>, Error=(::Error, Option<Request<B>>)> + Send> | ||||
|     where | ||||
|         B: Send, | ||||
|     { | ||||
|         match self.tx { | ||||
|             PoolTx::Http1(ref mut tx) => tx.send_request_retryable(req), | ||||
|             PoolTx::Http2(ref mut tx) => tx.send_request_retryable(req), | ||||
|         } | ||||
|         }) | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										21
									
								
								src/common/macros.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/common/macros.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| #[macro_export] | ||||
| #[cfg(__hyper_impl_trait_available)] | ||||
| macro_rules! impl_trait { | ||||
|     (ty: $($t:tt)+) => { | ||||
|         impl $($t)+ | ||||
|     }; | ||||
|     (e: $e:expr) => { | ||||
|         $e | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[macro_export] | ||||
| #[cfg(not(__hyper_impl_trait_available))] | ||||
| macro_rules! impl_trait { | ||||
|     (ty: $($t:tt)+) => { | ||||
|         Box<$($t)+> | ||||
|     }; | ||||
|     (e: $e:expr) => { | ||||
|         Box::new($e) | ||||
|     } | ||||
| } | ||||
| @@ -2,6 +2,8 @@ mod buf; | ||||
| mod exec; | ||||
| pub(crate) mod io; | ||||
| mod lazy; | ||||
| #[macro_use] | ||||
| mod macros; | ||||
| mod never; | ||||
|  | ||||
| pub(crate) use self::buf::StaticBuf; | ||||
|   | ||||
| @@ -2,7 +2,7 @@ use bytes::BytesMut; | ||||
| use http::HeaderMap; | ||||
| use http::header::{CONTENT_LENGTH, TRANSFER_ENCODING}; | ||||
| use http::header::{HeaderValue, OccupiedEntry, ValueIter}; | ||||
| #[cfg(not(inherent_ascii))] | ||||
| #[cfg(not(__hyper_inherent_ascii))] | ||||
| use std::ascii::AsciiExt; | ||||
|  | ||||
| pub fn connection_keep_alive(value: &HeaderValue) -> bool { | ||||
|   | ||||
| @@ -52,6 +52,7 @@ pub use error::{Result, Error}; | ||||
| pub use body::{Body, Chunk}; | ||||
| pub use server::Server; | ||||
|  | ||||
| #[macro_use] | ||||
| mod common; | ||||
| #[cfg(test)] | ||||
| mod mock; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user