9 releases

0.3.4 Nov 29, 2023
0.3.3 Jun 2, 2023
0.3.2 Sep 16, 2021
0.3.1 Mar 23, 2021
0.1.0 Mar 10, 2021

#217 in Asynchronous

28 downloads per month

MIT license

27KB
445 lines

crates.io dependency status docs.rs MIT License Build Test Audit codecov

async-transmit

Async trait for transmitting data to peers

async-transmit crate provides Transmit trait which allows value to be transmit asynchronously.

This crate relies on async-trait, the original definition of the Transmit trait is:

use async_trait::async_trait;

#[async_trait]
pub trait Transmit {
    type Item;
    type Error;

    async fn transmit(&mut self, item: Self::Item) -> Result<(), Self::Error>
    where
        Self::Item: 'async_trait;
}

So use #[async_trait] to when implement Transmit like:

use async_transmit::*;
use async_trait::async_trait;

struct VoidTransmitter<I, E> {
    phantom: std::marker::PhantomData<(I, E)>,
}

#[async_trait]
impl<I, E> Transmit for VoidTransmitter<I, E>
where
    I: Send,
    E: Send,
{
    type Item = I;
    type Error = E;

    async fn transmit(&mut self, item: Self::Item) -> Result<(), Self::Error>
    where
        I: 'async_trait,
    {
        // Do Nothing
        Ok(())
    }
}

With async-std/async-channel

If you'd like to play with async_std::channel::Sender or async_channel::Sender, use with-async-channel feature like:

[dependencies.async-transmit]
version = "0.1.0"
features = ["with-async-channel"]

Then you can use transmit() method through Transmit trait on the sender like:

use async_transmit::*;

let (mut s, r) = async_channel::unbounded::<&'static str>();

s.transmit("Hello").await?;
s.transmit("World").await?;
drop(s);
assert_eq!(Some("Hello"), r.recv().await.ok());
assert_eq!(Some("World"), r.recv().await.ok());
assert_eq!(None, r.recv().await.ok());

With tokio

If you'd like to play with tokio::sync::mpsc::Sender or tokio::sync::mpsc::UnboundedSender, use with-tokio feature like:

[dependencies.async-transmit]
version = "0.1.0"
features = ["with-tokio"]

Then you can use transmit() method through Transmit trait on the sender like:

use async_transmit::*;

let (mut s, mut r) = tokio::sync::mpsc::unbounded_channel::<&'static str>();

s.transmit("Hello").await?;
s.transmit("World").await?;
drop(s);
assert_eq!(Some("Hello"), r.recv().await);
assert_eq!(Some("World"), r.recv().await);
assert_eq!(None, r.recv().await);

With futures-rs

If you'd like to play with futures::sink::Sink, use with-sink feature like:

[dependencies.async-transmit]
version = "0.1.0"
features = ["with-sink"]

Then you can use async_transmit::from_sink() to create a wrapper object which implements Transmit trait like:

use async_transmit::*;
use futures::prelude::*;

let (s, mut r) = futures::channel::mpsc::unbounded::<&'static str>();
let mut s = from_sink(s);

s.transmit("Hello").await?;
s.transmit("World").await?;
drop(s);
assert_eq!(Some("Hello"), r.next().await);
assert_eq!(Some("World"), r.next().await);
assert_eq!(None, r.next().await);

License

The code follows MIT license written in LICENSE. Contributors need to agree that any modifications sent in this repository follow the license.

Dependencies

~0.5–2.3MB
~45K SLoC