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异步

MIT 许可证

27KB
445

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

async-transmit

异步特质,用于将数据异步传输到对等方

async-transmit crate 提供 Transmit 特质,允许值异步传输。

此 crate 依赖于 async-traitTransmit 特质的原始定义如下

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::Senderasync_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::Sendertokio::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