use crate::sealed::Sealed;
use futures::{Future, Poll};
use tower_service::Service;
pub trait MakeService<Target, Request>: Sealed<(Target, Request)> {
type Response;
type Error;
type Service: Service<Request, Response = Self::Response, Error = Self::Error>;
type MakeError;
type Future: Future<Item = Self::Service, Error = Self::MakeError>;
fn poll_ready(&mut self) -> Poll<(), Self::MakeError>;
fn make_service(&mut self, target: Target) -> Self::Future;
}
impl<M, S, Target, Request> Sealed<(Target, Request)> for M
where
M: Service<Target, Response = S>,
S: Service<Request>,
{
}
impl<M, S, Target, Request> MakeService<Target, Request> for M
where
M: Service<Target, Response = S>,
S: Service<Request>,
{
type Response = S::Response;
type Error = S::Error;
type Service = S;
type MakeError = M::Error;
type Future = M::Future;
fn poll_ready(&mut self) -> Poll<(), Self::MakeError> {
Service::poll_ready(self)
}
fn make_service(&mut self, target: Target) -> Self::Future {
Service::call(self, target)
}
}