9 个版本
0.3.4 | 2023年11月29日 |
---|---|
0.3.3 | 2023年6月2日 |
0.3.2 | 2021年9月16日 |
0.3.1 | 2021年3月23日 |
0.1.0 | 2021年3月10日 |
#219 在 异步
27KB
445 行
async-transmit
异步特质,用于将数据异步传输到对等方
async-transmit
crate 提供 Transmit
特质,允许值异步传输。
此 crate 依赖于 async-trait,Transmit
特质的原始定义如下
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;
}
因此,在实现类似于 Transmit
时使用 #[async_trait]
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(())
}
}
与 async-std/async-channel 一起使用
如果您想与 async_std::channel::Sender
或 async_channel::Sender
一起玩耍,请使用 with-async-channel
功能
[dependencies.async-transmit]
version = "0.1.0"
features = ["with-async-channel"]
然后您可以通过 Transmit
特质在发送者上使用 transmit()
方法,如下所示
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());
与 tokio 一起使用
如果您想与 tokio::sync::mpsc::Sender
或 tokio::sync::mpsc::UnboundedSender
一起玩耍,请使用 with-tokio
功能
[dependencies.async-transmit]
version = "0.1.0"
features = ["with-tokio"]
然后您可以通过 Transmit
特质在发送者上使用 transmit()
方法,如下所示
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);
与 futures-rs 一起使用
如果您想与 futures::sink::Sink
一起玩耍,请使用 with-sink
功能
[dependencies.async-transmit]
version = "0.1.0"
features = ["with-sink"]
然后您可以使用async_transmit::from_sink()
来创建一个包装对象,该对象实现了Transmit
特质,如下所示:
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);
许可证
代码遵循MIT许可证,该许可证以LICENSE的形式编写。贡献者需要同意在此存储库中发送的任何修改都遵循该许可证。
依赖项
~0.4–2.3MB
~44K SLoC