10 releases (1 stable)
1.0.0 | Nov 8, 2024 |
---|---|
0.3.4 | Nov 29, 2023 |
0.3.3 | Jun 2, 2023 |
0.3.2 | Sep 16, 2021 |
0.1.0 | Mar 10, 2021 |
#419 in Asynchronous
168 downloads per month
27KB
445 lines
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.3–6.5MB
~41K SLoC