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