Sink

Trait Sink 

Source
pub trait Sink {
    type Item;

    // Required method
    fn poll_send(
        self: Pin<&mut Self>,
        cx: &mut Context<'_>,
        value: Self::Item,
    ) -> PollSend<Self::Item>;

    // Provided methods
    fn send(&mut self, value: Self::Item) -> SendFuture<'_, Self>  { ... }
    fn try_send(
        &mut self,
        value: Self::Item,
    ) -> Result<(), TrySendError<Self::Item>>
       where Self: Unpin { ... }
    fn after<Before>(self, before: Before) -> ChainSink<Before, Self>
       where Before: Sink<Item = Self::Item>,
             Self: Sized { ... }
    fn filter<Filter>(self, filter: Filter) -> FilterSink<Filter, Self>
       where Filter: FnMut(&Self::Item) -> bool,
             Self: Sized { ... }
}
Expand description

A sink which can asynchronously accept messages, and at some point may refuse to accept any further messages.

Sinks implement poll_send, a poll-based method very similar to std::future::Future.

Sinks can be used in async code with stream.send(value).await, or with stream.try_send(value). Note that send returns an error if the sink has been closed. And try_send returns an error if the sink is full, or it is closed.

Send errors can be ignored using Result::ok.

use postage::mpsc::channel;
use postage::sink::{Sink, TrySendError};

#[tokio::main]
async fn main() -> Result<(), TrySendError<bool>> {
    let (mut tx, mut rx) = channel(16);
    tx.send(true).await.ok();
    tx.try_send(true)?;
    drop(tx);
    Ok(())
}

Sinks also support combinators, such as map, filter, chain, and log.

use postage::mpsc::channel;
use postage::sink::{Sink, SendError, TrySendError};
use postage::stream::Stream;

#[tokio::main]
async fn main() {
    let (mut tx, mut rx) = channel(16);
    let (tx2, mut rx2) = channel(16);

    let mut combo = tx2
        .after(tx)
        .filter(|i| *i >= 2);
     
    // The `logging` feature enables a combinator that logs values using the Debug trait.
    #[cfg(feature = "logging")]
    let mut combo = combo
        .log(log::Level::Info);

    combo.send(1usize).await.ok();
    combo.send(2usize).await.ok();
    assert_eq!(Some(2usize), rx.recv().await);
    drop(rx);

    combo.send(3usize).await.ok();
    combo.send(4usize).await.ok();
    assert_eq!(Some(3usize), rx2.recv().await);
    assert_eq!(Some(4usize), rx2.recv().await);

    drop(rx2);
    assert_eq!(Err(SendError(5usize)), combo.send(5usize).await);
}

Required Associated Types§

Required Methods§

Source

fn poll_send( self: Pin<&mut Self>, cx: &mut Context<'_>, value: Self::Item, ) -> PollSend<Self::Item>

Attempts to accept the message, without blocking.

Returns:

  • PollSend::Ready if the value was sent
  • PollSend::Pending(value) if the channel is full. The channel will call the waker in cx when the item may be accepted in the future.
  • PollSend::Rejected(value) if the channel is closed, and will never accept the item.

Provided Methods§

Source

fn send(&mut self, value: Self::Item) -> SendFuture<'_, Self>

Attempts to send a message into the sink.

Returns:

  • Ok(()) if the value was accepted.
  • Err(SendError(value)) if the sink rejected the message.
Source

fn try_send( &mut self, value: Self::Item, ) -> Result<(), TrySendError<Self::Item>>
where Self: Unpin,

Attempts to send a message over the sink, without blocking.

Returns:

  • Ok(()) if the value was accepted.
  • Err(TrySendError::Pending(value)) if the channel is full, and cannot accept the item at this time.
  • Err(TrySendError::Rejected(value)) if the channel is closed, and will never accept the item.
Source

fn after<Before>(self, before: Before) -> ChainSink<Before, Self>
where Before: Sink<Item = Self::Item>, Self: Sized,

Chains two sink implementations. Messages will be transmitted to the argument until it rejects a message. Then messages will be transmitted to self.

Source

fn filter<Filter>(self, filter: Filter) -> FilterSink<Filter, Self>
where Filter: FnMut(&Self::Item) -> bool, Self: Sized,

Filters messages, forwarding them to the sink if the filter returns true

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl<P, S> Sink for Pin<P>
where P: DerefMut<Target = S> + Unpin, S: Sink + Unpin + ?Sized,

Source§

type Item = <S as Sink>::Item

Source§

fn poll_send( self: Pin<&mut Self>, cx: &mut Context<'_>, value: Self::Item, ) -> PollSend<Self::Item>

Source§

impl<S> Sink for &mut S
where S: Sink + Unpin + ?Sized,

Source§

type Item = <S as Sink>::Item

Source§

fn poll_send( self: Pin<&mut Self>, cx: &mut Context<'_>, value: Self::Item, ) -> PollSend<Self::Item>

Implementors§

Source§

impl Sink for postage::barrier::Sender

Source§

impl<T> Sink for postage::broadcast::Sender<T>
where T: Clone,

Source§

type Item = T

Source§

impl<T> Sink for postage::dispatch::Sender<T>

Source§

type Item = T

Source§

impl<T> Sink for postage::mpsc::Sender<T>

Source§

type Item = T

Source§

impl<T> Sink for postage::oneshot::Sender<T>

Source§

type Item = T

Source§

impl<T> Sink for postage::watch::Sender<T>

Source§

type Item = T