use std::marker::PhantomData; use futures::{Async, Future, Poll}; use super::{NewTransform, Transform}; /// Service for the `map_err` combinator, changing the type of a transform's /// error. /// /// This is created by the `Transform::map_err` method. pub struct TransformMapErr { transform: T, f: F, _t: PhantomData<(S, E)>, } impl TransformMapErr { /// Create new `MapErr` combinator pub fn new(transform: T, f: F) -> Self where T: Transform, F: Fn(T::Error) -> E, { Self { transform, f, _t: PhantomData, } } } impl Clone for TransformMapErr where T: Clone, F: Clone, { fn clone(&self) -> Self { TransformMapErr { transform: self.transform.clone(), f: self.f.clone(), _t: PhantomData, } } } impl Transform for TransformMapErr where T: Transform, F: Fn(T::Error) -> E + Clone, { type Request = T::Request; type Response = T::Response; type Error = E; type Future = TransformMapErrFuture; fn poll_ready(&mut self) -> Poll<(), Self::Error> { self.transform.poll_ready().map_err(&self.f) } fn call(&mut self, req: T::Request, service: &mut S) -> Self::Future { TransformMapErrFuture::new(self.transform.call(req, service), self.f.clone()) } } pub struct TransformMapErrFuture where T: Transform, F: Fn(T::Error) -> E, { f: F, fut: T::Future, } impl TransformMapErrFuture where T: Transform, F: Fn(T::Error) -> E, { fn new(fut: T::Future, f: F) -> Self { TransformMapErrFuture { f, fut } } } impl Future for TransformMapErrFuture where T: Transform, F: Fn(T::Error) -> E, { type Item = T::Response; type Error = E; fn poll(&mut self) -> Poll { self.fut.poll().map_err(&self.f) } } /// NewTransform for the `map_err` combinator, changing the type of a new /// transform's error. /// /// This is created by the `NewTransform::map_err` method. pub struct TransformMapErrNewTransform { t: T, f: F, e: PhantomData<(S, E)>, } impl TransformMapErrNewTransform { /// Create new `MapErr` new service instance pub fn new(t: T, f: F) -> Self where T: NewTransform, F: Fn(T::Error) -> E, { Self { t, f, e: PhantomData, } } } impl Clone for TransformMapErrNewTransform where T: Clone, F: Clone, { fn clone(&self) -> Self { Self { t: self.t.clone(), f: self.f.clone(), e: PhantomData, } } } impl NewTransform for TransformMapErrNewTransform where T: NewTransform, F: Fn(T::Error) -> E + Clone, { type Request = T::Request; type Response = T::Response; type Error = E; type Transform = TransformMapErr; type InitError = T::InitError; type Future = TransformMapErrNewTransformFuture; fn new_transform(&self) -> Self::Future { TransformMapErrNewTransformFuture::new(self.t.new_transform(), self.f.clone()) } } pub struct TransformMapErrNewTransformFuture where T: NewTransform, F: Fn(T::Error) -> E, { fut: T::Future, f: F, } impl TransformMapErrNewTransformFuture where T: NewTransform, F: Fn(T::Error) -> E, { fn new(fut: T::Future, f: F) -> Self { TransformMapErrNewTransformFuture { f, fut } } } impl Future for TransformMapErrNewTransformFuture where T: NewTransform, F: Fn(T::Error) -> E + Clone, { type Item = TransformMapErr; type Error = T::InitError; fn poll(&mut self) -> Poll { if let Async::Ready(tr) = self.fut.poll()? { Ok(Async::Ready(TransformMapErr::new(tr, self.f.clone()))) } else { Ok(Async::NotReady) } } }