Trait futures::sink::Sink
[−]
[src]
pub trait Sink { type SinkItem; type SinkError; fn start_send(&mut self,
item: Self::SinkItem)
-> StartSend<Self::SinkItem, Self::SinkError>; fn poll_complete(&mut self) -> Poll<(), Self::SinkError>; fn with<U, F, Fut>(self, f: F) -> With<Self, U, F, Fut> where F: FnMut(U) -> Fut, Fut: IntoFuture<Item=Self::SinkItem>, Fut::Error: From<Self::SinkError>, Self: Sized { ... } fn buffer(self, amt: usize) -> Buffer<Self> where Self: Sized { ... } fn flush(self) -> Flush<Self> where Self: Sized { ... } fn send(self, item: Self::SinkItem) -> Send<Self> where Self: Sized { ... } fn send_all<S>(self, stream: S) -> SendAll<Self, S> where S: Stream<Item=Self::SinkItem>, Self::SinkError: From<S::Error>, Self: Sized { ... } }
A Sink
is a value into which other values can be sent, asynchronously.
Basic examples of sinks include the sending side of:
- Channels
- Sockets
- Pipes
In addition to such "primitive" sinks, it's typical to layer additional functionality, such as buffering, on top of an existing sink.
Sending to a sink is "asynchronous" in the sense that the value may not be sent in its entirety immediately. Instead, values are sent in a two-phase way: first by initiating a send, and then by polling for completion. This two-phase setup is analogous to buffered writing in synchronous code, where writes often succeed immediately, but internally are buffered and are actually written only upon flushing.
In addition, the Sink
may be full, in which case it is not even possible
to start the sending process.
As with Future
and Stream
, the Sink
trait is built from a few core
required methods, and a host of default methods for working in a
higher-level way. The Sink::send_all
combinator is of particular
importance: you can use it to send an entire stream to a sink, which is
the simplest way to ultimately consume a sink.
Associated Types
type SinkItem
The type of value that the sink accepts.
type SinkError
The type of value produced by the sink when an error occurs.
Required Methods
fn start_send(&mut self,
item: Self::SinkItem)
-> StartSend<Self::SinkItem, Self::SinkError>
item: Self::SinkItem)
-> StartSend<Self::SinkItem, Self::SinkError>
Begin the process of sending a value to the sink.
As the name suggests, this method only begins the process of sending
the item. If the sink employs buffering, the item isn't fully processed
until the buffer is fully flushed. Since sinks are designed to work with
asynchronous I/O, the process of actually writing out the data to an
underlying object takes place asynchronously. You must use
poll_complete
in order to drive completion of a send. In particular,
start_send
does not begin the flushing process
Return value
This method returns AsyncSink::Ready
if the sink was able to start
sending item
. In that case, you must ensure that you call
poll_complete
to process the sent item to completion. Note, however,
that several calls to start_send
can be made prior to calling
poll_complete
, which will work on completing all pending items.
The method returns AsyncSink::NotReady
if the sink was unable to begin
sending, usually due to being full. The sink must have attempted to
complete processing any outstanding requests (equivalent to
poll_complete
) before yielding this result. The current task will be
automatically scheduled for notification when the sink may be ready to
receive new values.
Errors
If the sink encounters an error other than being temporarily full, it
uses the Err
variant to signal that error. In most cases, such errors
mean that the sink will permanently be unable to receive items.
Panics
This method may panic in a few situations, depending on the specific sink:
- It is called outside of the context of a task.
- A previous call to
start_send
orpoll_complete
yielded a permanent error.
fn poll_complete(&mut self) -> Poll<(), Self::SinkError>
Make progress on all pending requests, and determine whether they have completed.
Since sinks are asynchronous, no single method completes all of their
work in one shot. Instead, you use poll_complete
to repeatedly drive
the sink to make progress on requests (such as start_send
). As with
Future::poll
, if the pending requests are not able to complete during
this call, the current task is automatically scheduled to be woken up
again once more progress is possible.
Return value
Returns Ok(Async::Ready(()))
when no unprocessed requests remain.
Returns Ok(Async::NotReady)
if there is more work left to do, in which
case the current task is scheduled to wake up when more progress may be
possible.
Errors
Returns Err
if the sink encounters an error while processing one of
its pending requests. Due to the buffered nature of requests, it is not
generally possible to correlate the error with a particular request. As
with start_send
, these errors are generally "fatal" for continued use
of the sink.
Panics
This method may panic in a few situations, depending on the specific sink:
- It is called outside of the context of a task.
- A previous call to
start_send
orpoll_complete
yielded a permanent error.
Provided Methods
fn with<U, F, Fut>(self, f: F) -> With<Self, U, F, Fut> where F: FnMut(U) -> Fut, Fut: IntoFuture<Item=Self::SinkItem>, Fut::Error: From<Self::SinkError>, Self: Sized
Composes a function in front of the sink.
This adapter produces a new sink that passes each value through the
given function f
before sending it to self
.
To process each value, f
produces a future, which is then polled to
completion before passing its result down to the underlying sink. If the
future produces an error, that error is returned by the new sink.
Note that this function consumes the given sink, returning a wrapped
version, much like Iterator::map
.
fn buffer(self, amt: usize) -> Buffer<Self> where Self: Sized
Adds a fixed-size buffer to the current sink.
The resulting sink will buffer up to amt
items when the underlying
sink is unwilling to accept additional items. Calling poll_complete
on
the buffered sink will attempt to both empty the buffer and complete
processing on the underlying sink.
Note that this function consumes the given sink, returning a wrapped
version, much like Iterator::map
.
fn flush(self) -> Flush<Self> where Self: Sized
A future that completes when the sink has finished processing all pending requests.
The sink itself is returned after flushing is complete; this adapter is intended to be used when you want to stop sending to the sink until all current requests are processed.
fn send(self, item: Self::SinkItem) -> Send<Self> where Self: Sized
A future that completes after the given item has been fully processed into the sink, including flushing.
Note that, because of the flushing requirement, it is usually better
to batch together items to send via send_all
, rather than flushing
between each item.
On completion, the sink is returned.
fn send_all<S>(self, stream: S) -> SendAll<Self, S> where S: Stream<Item=Self::SinkItem>, Self::SinkError: From<S::Error>, Self: Sized
A future that completes after the given stream has been fully processed into the sink, including flushing.
This future will drive the stream to keep producing items until it is exhausted, sending each item to the sink. It will complete once both the stream is exhausted, and the sink has fully processed and flushed all of the items sent to it.
On completion, the sink is returned.
Implementors
impl<S, F, U: IntoFuture> Sink for AndThen<S, F, U> where S: Sink
impl<S, F> Sink for Filter<S, F> where S: Sink
impl<S, F> Sink for FilterMap<S, F> where S: Sink
impl<S> Sink for Flatten<S> where S: Sink + Stream
impl<S> Sink for Fuse<S> where S: Sink
impl<S, F> Sink for Map<S, F> where S: Sink
impl<S, F> Sink for MapErr<S, F> where S: Sink
impl<S, F, U> Sink for OrElse<S, F, U> where S: Sink, U: IntoFuture
impl<S> Sink for Peekable<S> where S: Sink + Stream
impl<S> Sink for Skip<S> where S: Sink
impl<S, P, R> Sink for SkipWhile<S, P, R> where S: Sink + Stream, R: IntoFuture
impl<S> Sink for Take<S> where S: Sink + Stream
impl<S, F, U> Sink for Then<S, F, U> where S: Sink, U: IntoFuture
impl<S> Sink for Buffered<S> where S: Sink + Stream, S::Item: IntoFuture
impl<S> Sink for BufferUnordered<S> where S: Sink + Stream, S::Item: IntoFuture
impl<S> Sink for Chunks<S> where S: Sink + Stream
impl<S: Sink> Sink for SplitSink<S>
impl<S, U, F, Fut> Sink for With<S, U, F, Fut> where S: Sink, F: FnMut(U) -> Fut, Fut: IntoFuture<Item=S::SinkItem>, Fut::Error: From<S::SinkError>
impl<S: Sink> Sink for Buffer<S>
impl<T> Sink for Vec<T>
impl<S: ?Sized + Sink> Sink for Box<S>
impl<'a, S: ?Sized + Sink> Sink for &'a mut S
impl<T> Sink for Sender<T>
impl<T> Sink for UnboundedSender<T>