From 9441624827e18c0f5a90b23a6582c4c1e1a7b29a Mon Sep 17 00:00:00 2001
From: Nikolay Kim <fafhrd91@gmail.com>
Date: Tue, 4 Sep 2018 09:30:52 -0700
Subject: [PATCH] use From/Into instead of custom IntoService and
 IntoNewService traits

---
 src/lib.rs                      |  2 +-
 src/service/and_then.rs         |  9 ++----
 src/service/apply.rs            |  7 +++--
 src/service/fn_service.rs       |  9 ++----
 src/service/fn_state_service.rs | 12 +++-----
 src/service/mod.rs              | 52 +++++----------------------------
 src/stream.rs                   |  6 ++--
 7 files changed, 25 insertions(+), 72 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs
index 2f694c7d..272339e2 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -63,7 +63,7 @@ mod worker;
 
 pub use configurable::{IntoNewConfigurableService, NewConfigurableService};
 pub use server::Server;
-pub use service::{IntoNewService, IntoService, NewServiceExt, ServiceExt};
+pub use service::{NewServiceExt, ServiceExt};
 
 /// Pause accepting incoming connections
 ///
diff --git a/src/service/and_then.rs b/src/service/and_then.rs
index 2d248667..0d4f2237 100644
--- a/src/service/and_then.rs
+++ b/src/service/and_then.rs
@@ -4,8 +4,6 @@ use std::rc::Rc;
 use futures::{Async, Future, Poll};
 use tower_service::{NewService, Service};
 
-use super::IntoNewService;
-
 /// `AndThen` service combinator
 pub struct AndThen<A, B> {
     a: A,
@@ -114,11 +112,8 @@ where
     B: NewService,
 {
     /// Create new `AndThen` combinator
-    pub fn new<F: IntoNewService<B>>(a: A, f: F) -> Self {
-        Self {
-            a,
-            b: f.into_new_service(),
-        }
+    pub fn new<F: Into<B>>(a: A, f: F) -> Self {
+        Self { a, b: f.into() }
     }
 }
 
diff --git a/src/service/apply.rs b/src/service/apply.rs
index 58755f6f..b688a8c1 100644
--- a/src/service/apply.rs
+++ b/src/service/apply.rs
@@ -1,7 +1,8 @@
 use std::marker::PhantomData;
 
 use futures::{Async, Future, IntoFuture, Poll};
-use {IntoNewService, NewService, Service};
+
+use {NewService, Service};
 
 /// `Apply` service combinator
 pub struct Apply<T, F, R, Req> {
@@ -62,10 +63,10 @@ where
     R: IntoFuture,
 {
     /// Create new `ApplyNewService` new service instance
-    pub fn new<F1: IntoNewService<T>>(f: F, service: F1) -> Self {
+    pub fn new<F1: Into<T>>(f: F, service: F1) -> Self {
         Self {
             f,
-            service: service.into_new_service(),
+            service: service.into(),
             r: PhantomData,
         }
     }
diff --git a/src/service/fn_service.rs b/src/service/fn_service.rs
index 6eee6c9b..e08770d7 100644
--- a/src/service/fn_service.rs
+++ b/src/service/fn_service.rs
@@ -6,8 +6,6 @@ use futures::{
 };
 use tower_service::{NewService, Service};
 
-use super::IntoNewService;
-
 pub struct FnService<F, Req, Resp, E, Fut>
 where
     F: Fn(Req) -> Fut,
@@ -113,14 +111,13 @@ where
     }
 }
 
-impl<F, Req, Resp, Err, IErr, Fut> IntoNewService<FnNewService<F, Req, Resp, Err, IErr, Fut>>
-    for F
+impl<F, Req, Resp, Err, IErr, Fut> From<F> for FnNewService<F, Req, Resp, Err, IErr, Fut>
 where
     F: Fn(Req) -> Fut + Clone + 'static,
     Fut: IntoFuture<Item = Resp, Error = Err>,
 {
-    fn into_new_service(self) -> FnNewService<F, Req, Resp, Err, IErr, Fut> {
-        FnNewService::new(self)
+    fn from(f: F) -> FnNewService<F, Req, Resp, Err, IErr, Fut> {
+        FnNewService::new(f)
     }
 }
 
diff --git a/src/service/fn_state_service.rs b/src/service/fn_state_service.rs
index 4a76ee36..f423c311 100644
--- a/src/service/fn_state_service.rs
+++ b/src/service/fn_state_service.rs
@@ -3,8 +3,6 @@ use std::marker;
 use futures::{Async, Future, IntoFuture, Poll};
 use tower_service::{NewService, Service};
 
-use super::IntoNewService;
-
 pub struct FnStateService<S, F, Req, Resp, Err, Fut>
 where
     F: Fn(&mut S, Req) -> Fut,
@@ -113,8 +111,8 @@ where
     }
 }
 
-impl<S, F1, F2, Req, Resp, Err1, Err2, Fut1, Fut2>
-    IntoNewService<FnStateNewService<S, F1, F2, Req, Resp, Err1, Err2, Fut1, Fut2>> for (F1, F2)
+impl<S, F1, F2, Req, Resp, Err1, Err2, Fut1, Fut2> From<(F1, F2)>
+    for FnStateNewService<S, F1, F2, Req, Resp, Err1, Err2, Fut1, Fut2>
 where
     S: 'static,
     F1: Fn(&mut S, Req) -> Fut1 + Clone + 'static,
@@ -126,10 +124,8 @@ where
     Err1: 'static,
     Err2: 'static,
 {
-    fn into_new_service(
-        self,
-    ) -> FnStateNewService<S, F1, F2, Req, Resp, Err1, Err2, Fut1, Fut2> {
-        FnStateNewService::new(self.0, self.1)
+    fn from(data: (F1, F2)) -> FnStateNewService<S, F1, F2, Req, Resp, Err1, Err2, Fut1, Fut2> {
+        FnStateNewService::new(data.0, data.1)
     }
 }
 
diff --git a/src/service/mod.rs b/src/service/mod.rs
index 940ab861..1066f372 100644
--- a/src/service/mod.rs
+++ b/src/service/mod.rs
@@ -33,10 +33,10 @@ pub trait ServiceExt: Service {
     fn and_then<F, B>(self, service: F) -> AndThen<Self, B>
     where
         Self: Sized,
-        F: IntoService<B>,
+        F: Into<B>,
         B: Service<Request = Self::Response, Error = Self::Error>,
     {
-        AndThen::new(self, service.into_service())
+        AndThen::new(self, service.into())
     }
 
     fn map<F, R>(self, f: F) -> Map<Self, F, R>
@@ -70,7 +70,7 @@ pub trait NewServiceExt: NewService {
     fn and_then<F, B>(self, new_service: F) -> AndThenNewService<Self, B>
     where
         Self: Sized,
-        F: IntoNewService<B>,
+        F: Into<B>,
         B: NewService<
             Request = Self::Response,
             Error = Self::Error,
@@ -113,51 +113,15 @@ pub trait NewServiceExt: NewService {
     }
 }
 
-impl<T: Service> ServiceExt for T {}
-impl<T: NewService> NewServiceExt for T {}
+impl<T: ?Sized> ServiceExt for T where T: Service {}
+impl<T: ?Sized> NewServiceExt for T where T: NewService {}
 
-/// Trait for types that can be converted to a Service
-pub trait IntoService<T>
-where
-    T: Service,
-{
-    /// Create service
-    fn into_service(self) -> T;
-}
-
-/// Trait for types that can be converted to a Service
-pub trait IntoNewService<T>
-where
-    T: NewService,
-{
-    /// Create service
-    fn into_new_service(self) -> T;
-}
-
-impl<T> IntoService<T> for T
-where
-    T: Service,
-{
-    fn into_service(self) -> T {
-        self
-    }
-}
-
-impl<T> IntoNewService<T> for T
-where
-    T: NewService,
-{
-    fn into_new_service(self) -> T {
-        self
-    }
-}
-
-impl<F, Req, Resp, Err, Fut> IntoService<FnService<F, Req, Resp, Err, Fut>> for F
+impl<F, Req, Resp, Err, Fut> From<F> for FnService<F, Req, Resp, Err, Fut>
 where
     F: Fn(Req) -> Fut + 'static,
     Fut: IntoFuture<Item = Resp, Error = Err>,
 {
-    fn into_service(self) -> FnService<F, Req, Resp, Err, Fut> {
-        FnService::new(self)
+    fn from(f: F) -> FnService<F, Req, Resp, Err, Fut> {
+        FnService::new(f)
     }
 }
diff --git a/src/stream.rs b/src/stream.rs
index f0ef120e..104d444c 100644
--- a/src/stream.rs
+++ b/src/stream.rs
@@ -2,7 +2,7 @@ use futures::unsync::mpsc;
 use futures::{Async, Future, Poll, Stream};
 use tokio::executor::current_thread::spawn;
 
-use super::{IntoService, Service};
+use super::Service;
 
 pub struct StreamDispatcher<S: Stream, T> {
     stream: S,
@@ -18,12 +18,12 @@ where
     T: Service<Request = Result<S::Item, S::Error>, Response = (), Error = ()>,
     T::Future: 'static,
 {
-    pub fn new<F: IntoService<T>>(stream: S, service: F) -> Self {
+    pub fn new<F: Into<T>>(stream: S, service: F) -> Self {
         let (stop_tx, stop_rx) = mpsc::unbounded();
         StreamDispatcher {
             stream,
             item: None,
-            service: service.into_service(),
+            service: service.into(),
             stop_rx,
             stop_tx,
         }