#async-channel #channel #io #future #async #non-blocking

async_channel_io

AsyncRead and AsyncWrite implementations for async_channel

1 unstable release

0.3.0 Apr 15, 2024

#1576 in Asynchronous

MIT license

16KB
237 lines

async_channel_io

Crates.io MIT licensed Build Status

Wrappers around async_channel Sender and Receiver which implement AsyncRead and AsyncWrite

Examples

Writer

use tokio::time;
use async_channel_io::ChannelWriter;
use futures::AsyncWriteExt;

async fn example() {
    let (send, recv) = async_channel::unbounded();
    let mut async_writer = ChannelWriter::new(send);

    async_writer.write(b"Hello").await.unwrap();
    tokio::spawn(async move {
        time::sleep(time::Duration::from_millis(50)).await;
        async_writer.write(b" World!").await.unwrap();
    });

    let mut message = String::new();

    while let Ok(received) = recv.recv().await {
        message.push_str(std::str::from_utf8(&received).unwrap())
    };
    assert_eq!(message, "Hello World!")
}

Reader

use tokio::time;
use async_channel_io::ChannelReader;
use futures::AsyncReadExt;

async fn example() {
    let (send, recv) = async_channel::unbounded();
    let mut async_reader = ChannelReader::new(recv);

    // Have some waiting in receiver
    send.send(String::from("hello").into()).await.unwrap();

    tokio::spawn(async move {
        // send some later
        time::sleep(time::Duration::from_millis(50)).await;
        send.send(String::from(" world").into()).await.unwrap();
    });
    let mut buf = vec![0; 11];

    async_reader.read_exact(&mut buf).await.unwrap();

    let read = String::from_utf8_lossy(&buf).to_string();
    assert_eq!("hello world", read);
}

Dependencies

~1.5MB
~23K SLoC