diff --git a/src/service/fn_service.rs b/src/service/fn_service.rs index 6eee6c9b..07c9df3a 100644 --- a/src/service/fn_service.rs +++ b/src/service/fn_service.rs @@ -6,7 +6,7 @@ use futures::{ }; use tower_service::{NewService, Service}; -use super::IntoNewService; +use super::{IntoNewService, IntoService}; pub struct FnService<F, Req, Resp, E, Fut> where @@ -68,6 +68,16 @@ where } } +impl<F, Req, Resp, Err, Fut> IntoService<FnService<F, Req, Resp, Err, Fut>> for F +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) + } +} + pub struct FnNewService<F, Req, Resp, Err, IErr, Fut> where F: Fn(Req) -> Fut, diff --git a/src/service/mod.rs b/src/service/mod.rs index e6580f4d..250accf3 100644 --- a/src/service/mod.rs +++ b/src/service/mod.rs @@ -103,15 +103,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 +/// Trait for types that can be converted to a `Service` pub trait IntoService<T> where T: Service, { - /// Create service + /// Convert to a `Service` fn into_service(self) -> T; } @@ -120,7 +120,7 @@ pub trait IntoNewService<T> where T: NewService, { - /// Create service + /// Convert to an `NewService` fn into_new_service(self) -> T; } @@ -141,13 +141,3 @@ where self } } - -impl<F, Req, Resp, Err, Fut> IntoService<FnService<F, Req, Resp, Err, Fut>> for F -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) - } -}