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
This commit is contained in:
Jon Gjengset 2019-09-10 11:48:01 -04:00 committed by GitHub
parent adca66cf74
commit 9691d0d379
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 56 additions and 37 deletions

View File

@ -11,7 +11,7 @@ members = [
"tower-limit", "tower-limit",
"tower-load", "tower-load",
"tower-load-shed", "tower-load-shed",
# "tower-reconnect", "tower-reconnect",
"tower-retry", "tower-retry",
"tower-service", "tower-service",
# "tower-spawn-ready", # "tower-spawn-ready",

View File

@ -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) # 0.1.0-alpha.2 (August 30, 2019)
- Update `tokio-io` to `alpha.4` - Update `tokio-io` to `alpha.4`

View File

@ -1,12 +1,12 @@
[package] [package]
name = "tower-make" name = "tower-make"
version = "0.1.0-alpha.2" version = "0.3.0-alpha.1"
authors = ["Tower Maintainers <team@tower-rs.com>"] authors = ["Tower Maintainers <team@tower-rs.com>"]
license = "MIT" license = "MIT"
readme = "README.md" readme = "README.md"
repository = "https://github.com/tower-rs/tower" repository = "https://github.com/tower-rs/tower"
homepage = "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 = """ description = """
Trait aliases for Services that produce specific types of Responses. Trait aliases for Services that produce specific types of Responses.
""" """

View File

@ -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)] #![deny(rust_2018_idioms)]
//! Trait aliases for Services that produce specific types of Responses. //! Trait aliases for Services that produce specific types of Responses.

View File

@ -1,3 +1,7 @@
# 0.3.0-alpha.1
- Move to `std::future`
# 0.1.0 (unreleased) # 0.1.0 (unreleased)
- Initial release - Initial release

View File

@ -8,13 +8,13 @@ name = "tower-reconnect"
# - README.md # - README.md
# - Update CHANGELOG.md. # - Update CHANGELOG.md.
# - Create "v0.1.x" git tag. # - Create "v0.1.x" git tag.
version = "0.1.0" version = "0.3.0-alpha.1"
authors = ["Tower Maintainers <team@tower-rs.com>"] authors = ["Tower Maintainers <team@tower-rs.com>"]
license = "MIT" license = "MIT"
readme = "README.md" readme = "README.md"
repository = "https://github.com/tower-rs/tower" repository = "https://github.com/tower-rs/tower"
homepage = "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 = """ description = """
Automatically recreate a new `Service` instance when an error is encountered. Automatically recreate a new `Service` instance when an error is encountered.
""" """
@ -24,6 +24,6 @@ publish = false
[dependencies] [dependencies]
log = "0.4.1" log = "0.4.1"
futures = "0.1.26" tower-service = "0.3.0-alpha.1"
tower-service = "0.2.0" tower-make = { version = "0.3.0-alpha.1", path = "../tower-make" }
tower-util = "0.1.0" pin-project = "0.4.0-alpha.10"

View File

@ -1,7 +1,14 @@
use crate::Error; 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<F> { pub struct ResponseFuture<F> {
#[pin]
inner: F, inner: F,
} }
@ -11,15 +18,14 @@ impl<F> ResponseFuture<F> {
} }
} }
impl<F> Future for ResponseFuture<F> impl<F, T, E> Future for ResponseFuture<F>
where where
F: Future, F: Future<Output = Result<T, E>>,
F::Error: Into<Error>, E: Into<Error>,
{ {
type Item = F::Item; type Output = Result<T, Error>;
type Error = Error;
fn poll(&mut self) -> Poll<Self::Item, Self::Error> { fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
self.inner.poll().map_err(Into::into) self.project().inner.poll(cx).map_err(Into::into)
} }
} }

View File

@ -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)] #![deny(rust_2018_idioms)]
#![allow(elided_lifetimes_in_paths)] #![allow(elided_lifetimes_in_paths)]
pub mod future; pub mod future;
use crate::future::ResponseFuture; use crate::future::ResponseFuture;
use futures::{Async, Future, Poll};
use log::trace; use log::trace;
use std::fmt; use std::fmt;
use std::{
future::Future,
pin::Pin,
task::{Context, Poll},
};
use tower_make::MakeService;
use tower_service::Service; use tower_service::Service;
use tower_util::MakeService;
pub struct Reconnect<M, Target> pub struct Reconnect<M, Target>
where where
@ -52,6 +56,7 @@ impl<M, Target, S, Request> Service<Request> for Reconnect<M, Target>
where where
M: Service<Target, Response = S>, M: Service<Target, Response = S>,
S: Service<Request>, S: Service<Request>,
M::Future: Unpin,
Error: From<M::Error> + From<S::Error>, Error: From<M::Error> + From<S::Error>,
Target: Clone, Target: Clone,
{ {
@ -59,7 +64,7 @@ where
type Error = Error; type Error = Error;
type Future = ResponseFuture<S::Future>; type Future = ResponseFuture<S::Future>;
fn poll_ready(&mut self) -> Poll<(), Self::Error> { fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
let ret; let ret;
let mut state; let mut state;
@ -67,11 +72,11 @@ where
match self.state { match self.state {
State::Idle => { State::Idle => {
trace!("poll_ready; idle"); trace!("poll_ready; idle");
match self.mk_service.poll_ready()? { match self.mk_service.poll_ready(cx) {
Async::Ready(()) => (), Poll::Ready(r) => r?,
Async::NotReady => { Poll::Pending => {
trace!("poll_ready; MakeService not ready"); trace!("poll_ready; MakeService not ready");
return Ok(Async::NotReady); return Poll::Pending;
} }
} }
@ -81,15 +86,15 @@ where
} }
State::Connecting(ref mut f) => { State::Connecting(ref mut f) => {
trace!("poll_ready; connecting"); trace!("poll_ready; connecting");
match f.poll() { match Pin::new(f).poll(cx) {
Ok(Async::Ready(service)) => { Poll::Ready(Ok(service)) => {
state = State::Connected(service); state = State::Connected(service);
} }
Ok(Async::NotReady) => { Poll::Pending => {
trace!("poll_ready; not ready"); trace!("poll_ready; not ready");
return Ok(Async::NotReady); return Poll::Pending;
} }
Err(e) => { Poll::Ready(Err(e)) => {
trace!("poll_ready; error"); trace!("poll_ready; error");
state = State::Idle; state = State::Idle;
ret = Err(e.into()); ret = Err(e.into());
@ -99,16 +104,16 @@ where
} }
State::Connected(ref mut inner) => { State::Connected(ref mut inner) => {
trace!("poll_ready; connected"); trace!("poll_ready; connected");
match inner.poll_ready() { match inner.poll_ready(cx) {
Ok(Async::Ready(_)) => { Poll::Ready(Ok(())) => {
trace!("poll_ready; ready"); trace!("poll_ready; ready");
return Ok(Async::Ready(())); return Poll::Ready(Ok(()));
} }
Ok(Async::NotReady) => { Poll::Pending => {
trace!("poll_ready; not ready"); trace!("poll_ready; not ready");
return Ok(Async::NotReady); return Poll::Pending;
} }
Err(_) => { Poll::Ready(Err(_)) => {
trace!("poll_ready; error"); trace!("poll_ready; error");
state = State::Idle; state = State::Idle;
} }
@ -120,7 +125,7 @@ where
} }
self.state = state; self.state = state;
ret Poll::Ready(ret)
} }
fn call(&mut self, request: Request) -> Self::Future { fn call(&mut self, request: Request) -> Self::Future {