use {Future, Poll, Async}; /// Future for the `map_err` combinator, changing the error type of a future. /// /// This is created by the `Future::map_err` method. #[derive(Debug)] #[must_use = "futures do nothing unless polled"] pub struct MapErr where A: Future { future: A, f: Option, } pub fn new(future: A, f: F) -> MapErr where A: Future { MapErr { future: future, f: Some(f), } } impl Future for MapErr where A: Future, F: FnOnce(A::Error) -> U, { type Item = A::Item; type Error = U; fn poll(&mut self) -> Poll { let e = match self.future.poll() { Ok(Async::NotReady) => return Ok(Async::NotReady), other => other, }; e.map_err(self.f.take().expect("cannot poll MapErr twice")) } }