futures_util/sink/
flush.rs1use futures_core::{Poll, Async, Future};
2use futures_core::task;
3use futures_sink::Sink;
4
5#[derive(Debug)]
8#[must_use = "futures do nothing unless polled"]
9pub struct Flush<S> {
10 sink: Option<S>,
11}
12
13pub fn new<S: Sink>(sink: S) -> Flush<S> {
20 Flush { sink: Some(sink) }
21}
22
23impl<S: Sink> Flush<S> {
24 pub fn get_ref(&self) -> Option<&S> {
27 self.sink.as_ref()
28 }
29
30 pub fn get_mut(&mut self) -> Option<&mut S> {
33 self.sink.as_mut()
34 }
35
36 pub fn into_inner(self) -> Option<S> {
39 self.sink
40 }
41}
42
43impl<S: Sink> Future for Flush<S> {
44 type Item = S;
45 type Error = S::SinkError;
46
47 fn poll(&mut self, cx: &mut task::Context) -> Poll<S, S::SinkError> {
48 let mut sink = self.sink.take().expect("Attempted to poll Flush after it completed");
49 if sink.poll_flush(cx)?.is_ready() {
50 Ok(Async::Ready(sink))
51 } else {
52 self.sink = Some(sink);
53 Ok(Async::Pending)
54 }
55 }
56}