From 9691d0d379a9964da59082b4d17379ae99a3a7b0 Mon Sep 17 00:00:00 2001 From: Jon Gjengset Date: Tue, 10 Sep 2019 11:48:01 -0400 Subject: [PATCH] Update tower-reconnect to std::future (#333) This bumps tower-reconnect to 0.3.0-alpha.1 It also makes the tower-make version consistent --- Cargo.toml | 2 +- tower-make/CHANGELOG.md | 4 ++++ tower-make/Cargo.toml | 4 ++-- tower-make/src/lib.rs | 2 +- tower-reconnect/CHANGELOG.md | 4 ++++ tower-reconnect/Cargo.toml | 10 ++++---- tower-reconnect/src/future.rs | 22 ++++++++++------- tower-reconnect/src/lib.rs | 45 +++++++++++++++++++---------------- 8 files changed, 56 insertions(+), 37 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 086acb6..02a15e1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ members = [ "tower-limit", "tower-load", "tower-load-shed", - # "tower-reconnect", + "tower-reconnect", "tower-retry", "tower-service", # "tower-spawn-ready", diff --git a/tower-make/CHANGELOG.md b/tower-make/CHANGELOG.md index 9479c80..20669a5 100644 --- a/tower-make/CHANGELOG.md +++ b/tower-make/CHANGELOG.md @@ -1,3 +1,7 @@ +# 0.3.0-alpha.1 + +- Bump version to match all the other crates with `std::future` + # 0.1.0-alpha.2 (August 30, 2019) - Update `tokio-io` to `alpha.4` diff --git a/tower-make/Cargo.toml b/tower-make/Cargo.toml index c9b772d..701d7a3 100644 --- a/tower-make/Cargo.toml +++ b/tower-make/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "tower-make" -version = "0.1.0-alpha.2" +version = "0.3.0-alpha.1" authors = ["Tower Maintainers "] license = "MIT" readme = "README.md" repository = "https://github.com/tower-rs/tower" homepage = "https://github.com/tower-rs/tower" -documentation = "https://docs.rs/tower-make/0.1.0-alpha.2" +documentation = "https://docs.rs/tower-make/0.3.0-alpha.1" description = """ Trait aliases for Services that produce specific types of Responses. """ diff --git a/tower-make/src/lib.rs b/tower-make/src/lib.rs index 42ab37b..1f27621 100644 --- a/tower-make/src/lib.rs +++ b/tower-make/src/lib.rs @@ -1,4 +1,4 @@ -#![doc(html_root_url = "https://docs.rs/tower-make/0.1.0-alpha.2")] +#![doc(html_root_url = "https://docs.rs/tower-make/0.3.0-alpha.1")] #![deny(rust_2018_idioms)] //! Trait aliases for Services that produce specific types of Responses. diff --git a/tower-reconnect/CHANGELOG.md b/tower-reconnect/CHANGELOG.md index cae251b..483fd9e 100644 --- a/tower-reconnect/CHANGELOG.md +++ b/tower-reconnect/CHANGELOG.md @@ -1,3 +1,7 @@ +# 0.3.0-alpha.1 + +- Move to `std::future` + # 0.1.0 (unreleased) - Initial release diff --git a/tower-reconnect/Cargo.toml b/tower-reconnect/Cargo.toml index cdea498..ff59415 100644 --- a/tower-reconnect/Cargo.toml +++ b/tower-reconnect/Cargo.toml @@ -8,13 +8,13 @@ name = "tower-reconnect" # - README.md # - Update CHANGELOG.md. # - Create "v0.1.x" git tag. -version = "0.1.0" +version = "0.3.0-alpha.1" authors = ["Tower Maintainers "] license = "MIT" readme = "README.md" repository = "https://github.com/tower-rs/tower" homepage = "https://github.com/tower-rs/tower" -documentation = "https://docs.rs/tower-reconnect/0.1.0" +documentation = "https://docs.rs/tower-reconnect/0.3.0-alpha.1" description = """ Automatically recreate a new `Service` instance when an error is encountered. """ @@ -24,6 +24,6 @@ publish = false [dependencies] log = "0.4.1" -futures = "0.1.26" -tower-service = "0.2.0" -tower-util = "0.1.0" +tower-service = "0.3.0-alpha.1" +tower-make = { version = "0.3.0-alpha.1", path = "../tower-make" } +pin-project = "0.4.0-alpha.10" diff --git a/tower-reconnect/src/future.rs b/tower-reconnect/src/future.rs index fffeb8f..719dbfa 100644 --- a/tower-reconnect/src/future.rs +++ b/tower-reconnect/src/future.rs @@ -1,7 +1,14 @@ use crate::Error; -use futures::{Future, Poll}; +use pin_project::pin_project; +use std::{ + future::Future, + pin::Pin, + task::{Context, Poll}, +}; +#[pin_project] pub struct ResponseFuture { + #[pin] inner: F, } @@ -11,15 +18,14 @@ impl ResponseFuture { } } -impl Future for ResponseFuture +impl Future for ResponseFuture where - F: Future, - F::Error: Into, + F: Future>, + E: Into, { - type Item = F::Item; - type Error = Error; + type Output = Result; - fn poll(&mut self) -> Poll { - self.inner.poll().map_err(Into::into) + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + self.project().inner.poll(cx).map_err(Into::into) } } diff --git a/tower-reconnect/src/lib.rs b/tower-reconnect/src/lib.rs index b6c1960..458666d 100644 --- a/tower-reconnect/src/lib.rs +++ b/tower-reconnect/src/lib.rs @@ -1,15 +1,19 @@ -#![doc(html_root_url = "https://docs.rs/tower-load-shed/0.1.0")] +#![doc(html_root_url = "https://docs.rs/tower-reconnect/0.3.0-alpha.1")] #![deny(rust_2018_idioms)] #![allow(elided_lifetimes_in_paths)] pub mod future; use crate::future::ResponseFuture; -use futures::{Async, Future, Poll}; use log::trace; use std::fmt; +use std::{ + future::Future, + pin::Pin, + task::{Context, Poll}, +}; +use tower_make::MakeService; use tower_service::Service; -use tower_util::MakeService; pub struct Reconnect where @@ -52,6 +56,7 @@ impl Service for Reconnect where M: Service, S: Service, + M::Future: Unpin, Error: From + From, Target: Clone, { @@ -59,7 +64,7 @@ where type Error = Error; type Future = ResponseFuture; - fn poll_ready(&mut self) -> Poll<(), Self::Error> { + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { let ret; let mut state; @@ -67,11 +72,11 @@ where match self.state { State::Idle => { trace!("poll_ready; idle"); - match self.mk_service.poll_ready()? { - Async::Ready(()) => (), - Async::NotReady => { + match self.mk_service.poll_ready(cx) { + Poll::Ready(r) => r?, + Poll::Pending => { trace!("poll_ready; MakeService not ready"); - return Ok(Async::NotReady); + return Poll::Pending; } } @@ -81,15 +86,15 @@ where } State::Connecting(ref mut f) => { trace!("poll_ready; connecting"); - match f.poll() { - Ok(Async::Ready(service)) => { + match Pin::new(f).poll(cx) { + Poll::Ready(Ok(service)) => { state = State::Connected(service); } - Ok(Async::NotReady) => { + Poll::Pending => { trace!("poll_ready; not ready"); - return Ok(Async::NotReady); + return Poll::Pending; } - Err(e) => { + Poll::Ready(Err(e)) => { trace!("poll_ready; error"); state = State::Idle; ret = Err(e.into()); @@ -99,16 +104,16 @@ where } State::Connected(ref mut inner) => { trace!("poll_ready; connected"); - match inner.poll_ready() { - Ok(Async::Ready(_)) => { + match inner.poll_ready(cx) { + Poll::Ready(Ok(())) => { trace!("poll_ready; ready"); - return Ok(Async::Ready(())); + return Poll::Ready(Ok(())); } - Ok(Async::NotReady) => { + Poll::Pending => { trace!("poll_ready; not ready"); - return Ok(Async::NotReady); + return Poll::Pending; } - Err(_) => { + Poll::Ready(Err(_)) => { trace!("poll_ready; error"); state = State::Idle; } @@ -120,7 +125,7 @@ where } self.state = state; - ret + Poll::Ready(ret) } fn call(&mut self, request: Request) -> Self::Future {