use futures::{Future, Poll, Stream}; use http; use tokio_service::Service; use client::{Connect, Client, FutureResponse}; use error::Error; use proto::Body; /// A Client to make outgoing HTTP requests. #[derive(Debug)] pub struct CompatClient { inner: Client } pub fn client(client: Client) -> CompatClient { CompatClient { inner: client } } impl Service for CompatClient where C: Connect, B: Stream + 'static, B::Item: AsRef<[u8]>, { type Request = http::Request; type Response = http::Response; type Error = Error; type Future = CompatFutureResponse; fn call(&self, req: Self::Request) -> Self::Future { future(self.inner.call(req.into())) } } /// A `Future` that will resolve to an `http::Response`. #[must_use = "futures do nothing unless polled"] #[derive(Debug)] pub struct CompatFutureResponse { inner: FutureResponse } pub fn future(fut: FutureResponse) -> CompatFutureResponse { CompatFutureResponse { inner: fut } } impl Future for CompatFutureResponse { type Item = http::Response; type Error = Error; fn poll(&mut self) -> Poll { self.inner.poll() .map(|a| a.map(|r| r.into())) } }