use std::marker::PhantomData; use futures::{Future, Poll}; use super::Transform; /// NewTransform for the `map_init_err` combinator, changing the type of a new /// transform's error. /// /// This is created by the `NewTransform::map_init_err` method. pub struct TransformMapInitErr { t: T, f: F, e: PhantomData<(S, E)>, } impl TransformMapInitErr { /// Create new `MapInitErr` new transform instance pub fn new(t: T, f: F) -> Self where T: Transform, F: Fn(T::InitError) -> E, { Self { t, f, e: PhantomData, } } } impl Clone for TransformMapInitErr where T: Clone, F: Clone, { fn clone(&self) -> Self { Self { t: self.t.clone(), f: self.f.clone(), e: PhantomData, } } } impl Transform for TransformMapInitErr where T: Transform, F: Fn(T::InitError) -> E + Clone, { type Response = T::Response; type Error = T::Error; type Transform = T::Transform; type InitError = E; type Future = TransformMapInitErrFuture; fn new_transform(&self, service: S) -> Self::Future { TransformMapInitErrFuture::new(self.t.new_transform(service), self.f.clone()) } } pub struct TransformMapInitErrFuture where T: Transform, F: Fn(T::InitError) -> E, { fut: T::Future, f: F, } impl TransformMapInitErrFuture where T: Transform, F: Fn(T::InitError) -> E, { fn new(fut: T::Future, f: F) -> Self { TransformMapInitErrFuture { f, fut } } } impl Future for TransformMapInitErrFuture where T: Transform, F: Fn(T::InitError) -> E + Clone, { type Item = T::Transform; type Error = E; fn poll(&mut self) -> Poll { self.fut.poll().map_err(&self.f) } }