feat(service): export hyper::service::MakeServiceRef
				
					
				
			It's sealed, and has a blanket implementation, and so should only be used as bounds. Even still, its hidden from the docs.
This commit is contained in:
		| @@ -25,10 +25,9 @@ use common::exec::{Exec, H2Exec, NewSvcExec}; | |||||||
| use common::io::Rewind; | use common::io::Rewind; | ||||||
| use error::{Kind, Parse}; | use error::{Kind, Parse}; | ||||||
| use proto; | use proto; | ||||||
| use service::Service; | use service::{MakeServiceRef, Service}; | ||||||
| use upgrade::Upgraded; | use upgrade::Upgraded; | ||||||
|  |  | ||||||
| pub(super) use self::make_service::MakeServiceRef; |  | ||||||
| pub(super) use self::spawn_all::NoopWatcher; | pub(super) use self::spawn_all::NoopWatcher; | ||||||
| use self::spawn_all::NewSvcTask; | use self::spawn_all::NewSvcTask; | ||||||
| pub(super) use self::spawn_all::Watcher; | pub(super) use self::spawn_all::Watcher; | ||||||
| @@ -910,37 +909,3 @@ mod upgrades { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| pub(crate) mod make_service { |  | ||||||
|     use std::error::Error as StdError; |  | ||||||
|  |  | ||||||
|     pub trait MakeServiceRef<Ctx> { |  | ||||||
|         type Error: Into<Box<StdError + Send + Sync>>; |  | ||||||
|         type ReqBody: ::body::Payload; |  | ||||||
|         type ResBody: ::body::Payload; |  | ||||||
|         type Service: ::service::Service<ReqBody=Self::ReqBody, ResBody=Self::ResBody, Error=Self::Error>; |  | ||||||
|         type Future: ::futures::Future<Item=Self::Service>; |  | ||||||
|  |  | ||||||
|         fn make_service_ref(&mut self, ctx: &Ctx) -> Self::Future; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     impl<T, Ctx, E, ME, S, F, IB, OB> MakeServiceRef<Ctx> for T |  | ||||||
|     where |  | ||||||
|         T: for<'a> ::service::MakeService<&'a Ctx, Error=E, MakeError=ME, Service=S, Future=F, ReqBody=IB, ResBody=OB>, |  | ||||||
|         E: Into<Box<StdError + Send + Sync>>, |  | ||||||
|         ME: Into<Box<StdError + Send + Sync>>, |  | ||||||
|         S: ::service::Service<ReqBody=IB, ResBody=OB, Error=E>, |  | ||||||
|         F: ::futures::Future<Item=S, Error=ME>, |  | ||||||
|         IB: ::body::Payload, |  | ||||||
|         OB: ::body::Payload, |  | ||||||
|     { |  | ||||||
|         type Error = E; |  | ||||||
|         type Service = S; |  | ||||||
|         type ReqBody = IB; |  | ||||||
|         type ResBody = OB; |  | ||||||
|         type Future = F; |  | ||||||
|  |  | ||||||
|         fn make_service_ref(&mut self, ctx: &Ctx) -> Self::Future { |  | ||||||
|             self.make_service(ctx) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -65,10 +65,10 @@ use tokio_io::{AsyncRead, AsyncWrite}; | |||||||
|  |  | ||||||
| use body::{Body, Payload}; | use body::{Body, Payload}; | ||||||
| use common::exec::{Exec, H2Exec, NewSvcExec}; | use common::exec::{Exec, H2Exec, NewSvcExec}; | ||||||
| use service::Service; | use service::{MakeServiceRef, Service}; | ||||||
| // Renamed `Http` as `Http_` for now so that people upgrading don't see an | // Renamed `Http` as `Http_` for now so that people upgrading don't see an | ||||||
| // error that `hyper::server::Http` is private... | // error that `hyper::server::Http` is private... | ||||||
| use self::conn::{Http as Http_, MakeServiceRef, NoopWatcher, SpawnAll}; | use self::conn::{Http as Http_, NoopWatcher, SpawnAll}; | ||||||
| use self::shutdown::{Graceful, GracefulWatcher}; | use self::shutdown::{Graceful, GracefulWatcher}; | ||||||
| #[cfg(feature = "runtime")] use self::tcp::AddrIncoming; | #[cfg(feature = "runtime")] use self::tcp::AddrIncoming; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,8 +4,8 @@ use tokio_io::{AsyncRead, AsyncWrite}; | |||||||
| use body::{Body, Payload}; | use body::{Body, Payload}; | ||||||
| use common::drain::{self, Draining, Signal, Watch, Watching}; | use common::drain::{self, Draining, Signal, Watch, Watching}; | ||||||
| use common::exec::{H2Exec, NewSvcExec}; | use common::exec::{H2Exec, NewSvcExec}; | ||||||
| use service::Service; | use service::{MakeServiceRef, Service}; | ||||||
| use super::conn::{MakeServiceRef, SpawnAll, UpgradeableConnection, Watcher}; | use super::conn::{SpawnAll, UpgradeableConnection, Watcher}; | ||||||
|  |  | ||||||
| #[allow(missing_debug_implementations)] | #[allow(missing_debug_implementations)] | ||||||
| pub struct Graceful<I, S, F, E> { | pub struct Graceful<I, S, F, E> { | ||||||
|   | |||||||
| @@ -34,6 +34,68 @@ pub trait MakeService<Ctx> { | |||||||
|     fn make_service(&mut self, ctx: Ctx) -> Self::Future; |     fn make_service(&mut self, ctx: Ctx) -> Self::Future; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Just a sort-of "trait alias" of `MakeService`, not to be implemented | ||||||
|  | // by anyone, only used as bounds. | ||||||
|  | #[doc(hidden)] | ||||||
|  | pub trait MakeServiceRef<Ctx>: self::sealed::Sealed<Ctx> { | ||||||
|  |     type ReqBody: Payload; | ||||||
|  |     type ResBody: Payload; | ||||||
|  |     type Error: Into<Box<StdError + Send + Sync>>; | ||||||
|  |     type Service: Service< | ||||||
|  |         ReqBody=Self::ReqBody, | ||||||
|  |         ResBody=Self::ResBody, | ||||||
|  |         Error=Self::Error, | ||||||
|  |     >; | ||||||
|  |     type Future: Future<Item=Self::Service>; | ||||||
|  |  | ||||||
|  |     // Acting like a #[non_exhaustive] for associated types of this trait. | ||||||
|  |     // | ||||||
|  |     // Basically, no one outside of hyper should be able to set this type | ||||||
|  |     // or declare bounds on it, so it should prevent people from creating | ||||||
|  |     // trait objects or otherwise writing code that requires using *all* | ||||||
|  |     // of the associated types. | ||||||
|  |     // | ||||||
|  |     // Why? So we can add new associated types to this alias in the future, | ||||||
|  |     // if necessary. | ||||||
|  |     type __DontNameMe: self::sealed::CantImpl; | ||||||
|  |  | ||||||
|  |     fn make_service_ref(&mut self, ctx: &Ctx) -> Self::Future; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl<T, Ctx, E, ME, S, F, IB, OB> MakeServiceRef<Ctx> for T | ||||||
|  | where | ||||||
|  |     T: for<'a> MakeService<&'a Ctx, Error=E, MakeError=ME, Service=S, Future=F, ReqBody=IB, ResBody=OB>, | ||||||
|  |     E: Into<Box<StdError + Send + Sync>>, | ||||||
|  |     ME: Into<Box<StdError + Send + Sync>>, | ||||||
|  |     S: Service<ReqBody=IB, ResBody=OB, Error=E>, | ||||||
|  |     F: Future<Item=S, Error=ME>, | ||||||
|  |     IB: Payload, | ||||||
|  |     OB: Payload, | ||||||
|  | { | ||||||
|  |     type Error = E; | ||||||
|  |     type Service = S; | ||||||
|  |     type ReqBody = IB; | ||||||
|  |     type ResBody = OB; | ||||||
|  |     type Future = F; | ||||||
|  |  | ||||||
|  |     type __DontNameMe = self::sealed::CantName; | ||||||
|  |  | ||||||
|  |     fn make_service_ref(&mut self, ctx: &Ctx) -> Self::Future { | ||||||
|  |         self.make_service(ctx) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl<T, Ctx, E, ME, S, F, IB, OB> self::sealed::Sealed<Ctx> for T | ||||||
|  | where | ||||||
|  |     T: for<'a> MakeService<&'a Ctx, Error=E, MakeError=ME, Service=S, Future=F, ReqBody=IB, ResBody=OB>, | ||||||
|  |     E: Into<Box<StdError + Send + Sync>>, | ||||||
|  |     ME: Into<Box<StdError + Send + Sync>>, | ||||||
|  |     S: Service<ReqBody=IB, ResBody=OB, Error=E>, | ||||||
|  |     F: Future<Item=S, Error=ME>, | ||||||
|  |     IB: Payload, | ||||||
|  |     OB: Payload, | ||||||
|  | {} | ||||||
|  |  | ||||||
|  |  | ||||||
| /// Create a `MakeService` from a function. | /// Create a `MakeService` from a function. | ||||||
| /// | /// | ||||||
| @@ -94,3 +156,13 @@ impl<F> fmt::Debug for MakeServiceFn<F> { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | mod sealed { | ||||||
|  |     pub trait Sealed<T> {} | ||||||
|  |  | ||||||
|  |     pub trait CantImpl {} | ||||||
|  |  | ||||||
|  |     #[allow(missing_debug_implementations)] | ||||||
|  |     pub enum CantName {} | ||||||
|  |  | ||||||
|  |     impl CantImpl for CantName {} | ||||||
|  | } | ||||||
|   | |||||||
| @@ -33,7 +33,8 @@ mod make_service; | |||||||
| mod new_service; | mod new_service; | ||||||
| mod service; | mod service; | ||||||
|  |  | ||||||
| pub use self::make_service::{make_service_fn, MakeService}; | pub use self::make_service::{make_service_fn, MakeService, MakeServiceRef}; | ||||||
|  | // NewService is soft-deprecated. | ||||||
| #[doc(hidden)] | #[doc(hidden)] | ||||||
| pub use self::new_service::NewService; | pub use self::new_service::NewService; | ||||||
| pub use self::service::{service_fn, service_fn_ok, Service}; | pub use self::service::{service_fn, service_fn_ok, Service}; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user