1 use core::marker::PhantomData;
2 
3 use {Sink, Poll, StartSend};
4 
5 /// A sink combinator to change the error type of a sink.
6 ///
7 /// This is created by the `Sink::from_err` method.
8 #[derive(Clone, Debug)]
9 #[must_use = "futures do nothing unless polled"]
10 pub struct SinkFromErr<S, E> {
11     sink: S,
12     f: PhantomData<E>
13 }
14 
new<S, E>(sink: S) -> SinkFromErr<S, E> where S: Sink15 pub fn new<S, E>(sink: S) -> SinkFromErr<S, E>
16     where S: Sink
17 {
18     SinkFromErr {
19         sink: sink,
20         f: PhantomData
21     }
22 }
23 
24 impl<S, E> SinkFromErr<S, E> {
25     /// Get a shared reference to the inner sink.
get_ref(&self) -> &S26     pub fn get_ref(&self) -> &S {
27         &self.sink
28     }
29 
30     /// Get a mutable reference to the inner sink.
get_mut(&mut self) -> &mut S31     pub fn get_mut(&mut self) -> &mut S {
32         &mut self.sink
33     }
34 
35     /// Consumes this combinator, returning the underlying sink.
36     ///
37     /// Note that this may discard intermediate state of this combinator, so
38     /// care should be taken to avoid losing resources when this is called.
into_inner(self) -> S39     pub fn into_inner(self) -> S {
40         self.sink
41     }
42 }
43 
44 impl<S, E> Sink for SinkFromErr<S, E>
45     where S: Sink,
46           E: From<S::SinkError>
47 {
48     type SinkItem = S::SinkItem;
49     type SinkError = E;
50 
start_send(&mut self, item: Self::SinkItem) -> StartSend<Self::SinkItem, Self::SinkError>51     fn start_send(&mut self, item: Self::SinkItem) -> StartSend<Self::SinkItem, Self::SinkError> {
52         self.sink.start_send(item).map_err(|e| e.into())
53     }
54 
poll_complete(&mut self) -> Poll<(), Self::SinkError>55     fn poll_complete(&mut self) -> Poll<(), Self::SinkError> {
56         self.sink.poll_complete().map_err(|e| e.into())
57     }
58 
close(&mut self) -> Poll<(), Self::SinkError>59     fn close(&mut self) -> Poll<(), Self::SinkError> {
60         self.sink.close().map_err(|e| e.into())
61     }
62 }
63 
64 impl<S: ::stream::Stream, E> ::stream::Stream for SinkFromErr<S, E> {
65     type Item = S::Item;
66     type Error = S::Error;
67 
poll(&mut self) -> Poll<Option<S::Item>, S::Error>68     fn poll(&mut self) -> Poll<Option<S::Item>, S::Error> {
69         self.sink.poll()
70     }
71 }
72