use std::{future::Future, task::Context};
pub trait Sealed<C> {}
pub trait ServiceRef<IO>: Sealed<IO> {
type Future: Future<Output = Result<Self::Response, Self::Error>>;
type Response;
type Error;
fn poll_ready(&mut self, cx: &mut Context<'_>) -> std::task::Poll<Result<(), Self::Error>>;
fn call(&mut self, stream: &IO) -> Self::Future;
}
impl<IO, T> Sealed<IO> for T where T: for<'a> tower::Service<&'a IO> {}
impl<IO, T, F, R, E> ServiceRef<IO> for T
where
T: for<'a> tower::Service<&'a IO, Future = F, Response = R, Error = E>,
F: Future<Output = Result<R, E>>,
{
type Future = F;
type Response = R;
type Error = E;
fn poll_ready(&mut self, cx: &mut Context<'_>) -> std::task::Poll<Result<(), Self::Error>> {
tower::Service::poll_ready(self, cx)
}
fn call(&mut self, stream: &IO) -> Self::Future {
tower::Service::call(self, stream)
}
}