From 6e8417e08f3abd7b47cd258845f6769d14de6842 Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Tue, 7 Aug 2018 19:39:36 -0700 Subject: [PATCH] refactor(lib): use type macro to detect impl Trait --- build.rs | 5 ++-- src/client/conn.rs | 64 +++++--------------------------------------- src/client/mod.rs | 18 +++---------- src/common/macros.rs | 21 +++++++++++++++ src/common/mod.rs | 2 ++ src/headers.rs | 2 +- src/lib.rs | 1 + 7 files changed, 36 insertions(+), 77 deletions(-) create mode 100644 src/common/macros.rs diff --git a/build.rs b/build.rs index 31781f21..6107783a 100644 --- a/build.rs +++ b/build.rs @@ -2,13 +2,12 @@ extern crate rustc_version; use rustc_version::{version, Version}; fn main() { - // Check for a minimum version to see if new rust features can be used let version = version().unwrap(); if version >= Version::parse("1.26.0").unwrap() { - println!("cargo:rustc-cfg=impl_trait_available"); + println!("cargo:rustc-cfg=__hyper_impl_trait_available"); } if version >= Version::parse("1.23.0").unwrap() { - println!("cargo:rustc-cfg=inherent_ascii"); + println!("cargo:rustc-cfg=__hyper_inherent_ascii"); } } diff --git a/src/client/conn.rs b/src/client/conn.rs index 56ab7505..9aea409d 100644 --- a/src/client/conn.rs +++ b/src/client/conn.rs @@ -238,12 +238,11 @@ where } } - #[cfg(impl_trait_available)] - pub(crate) fn send_request_retryable(&mut self, req: Request) -> impl Future, Error = (::Error, Option>)> + Send + pub(crate) fn send_request_retryable(&mut self, req: Request) -> impl_trait!(ty: Future, Error = (::Error, Option>)> + 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) -> Box, Error=(::Error, Option>)> + 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 Http2SendRequest where B: Payload + 'static, { - #[cfg(impl_trait_available)] - pub(super) fn send_request_retryable(&mut self, req: Request) -> impl Future, Error=(::Error, Option>)> + Send + pub(super) fn send_request_retryable(&mut self, req: Request) -> impl_trait!(ty: Future, Error=(::Error, Option>)> + 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) -> Box, Error=(::Error, Option>)> + 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) + }) } } diff --git a/src/client/mod.rs b/src/client/mod.rs index 65018322..e7a104ff 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -623,26 +623,14 @@ impl PoolClient { } impl PoolClient { - #[cfg(impl_trait_available)] - fn send_request_retryable(&mut self, req: Request) -> impl Future, Error = (::Error, Option>)> + Send + fn send_request_retryable(&mut self, req: Request) -> impl_trait!(ty: Future, Error = (::Error, Option>)> + 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) -> Box, Error=(::Error, Option>)> + 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), - } + }) } } diff --git a/src/common/macros.rs b/src/common/macros.rs new file mode 100644 index 00000000..27e2bb56 --- /dev/null +++ b/src/common/macros.rs @@ -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) + } +} diff --git a/src/common/mod.rs b/src/common/mod.rs index 3cf1e04c..585c8295 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -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; diff --git a/src/headers.rs b/src/headers.rs index 08911901..a2b740ae 100644 --- a/src/headers.rs +++ b/src/headers.rs @@ -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 { diff --git a/src/lib.rs b/src/lib.rs index c757dad2..7891da19 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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;