[![crates.io](https://img.shields.io/crates/v/async-transmit.svg)](https://crates.io/crates/async-transmit) [![dependency status](https://deps.rs/repo/github/lambdalisue/rs-async-transmit/status.svg)](https://deps.rs/repo/github/lambdalisue/rs-async-transmit) [![docs.rs](https://docs.rs/async-transmit/badge.svg)](https://docs.rs/async-transmit) [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE) [![Build](https://github.com/lambdalisue/rs-async-transmit/actions/workflows/build.yml/badge.svg)](https://github.com/lambdalisue/rs-async-transmit/actions/workflows/build.yml) [![Test](https://github.com/lambdalisue/rs-async-transmit/actions/workflows/test.yml/badge.svg)](https://github.com/lambdalisue/rs-async-transmit/actions/workflows/test.yml) [![Audit](https://github.com/lambdalisue/rs-async-transmit/actions/workflows/audit.yml/badge.svg)](https://github.com/lambdalisue/rs-async-transmit/actions/workflows/audit.yml) [![codecov](https://codecov.io/github/lambdalisue/rs-async-transmit/branch/main/graph/badge.svg?token=O2TF00WUP7)](https://codecov.io/github/lambdalisue/rs-async-transmit) # 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: [async-trait]: https://github.com/dtolnay/async-trait ```rust 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: ```rust use async_transmit::*; use async_trait::async_trait; struct VoidTransmitter { phantom: std::marker::PhantomData<(I, E)>, } #[async_trait] impl Transmit for VoidTransmitter 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: [`async_std::channel::sender`]: https://docs.rs/async-std/1.9.0/async_std/channel/struct.Sender.html [`async_channel::sender`]: https://docs.rs/async-channel/1.6.1/async_channel/struct.Sender.html ```toml [dependencies.async-transmit] version = "0.1.0" features = ["with-async-channel"] ``` Then you can use `transmit()` method through `Transmit` trait on the sender like: ```rust 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: [`tokio::sync::mpsc::sender`]: https://docs.rs/tokio/1.3.0/tokio/sync/mpsc/struct.Sender.html [`tokio::sync::mpsc::unboundedsender`]: https://docs.rs/tokio/1.3.0/tokio/sync/mpsc/struct.UnboundedSender.html ```toml [dependencies.async-transmit] version = "0.1.0" features = ["with-tokio"] ``` Then you can use `transmit()` method through `Transmit` trait on the sender like: ```rust 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: [`futures::sink::sink`]: https://docs.rs/futures/0.3.13/futures/sink/trait.Sink.html ```toml [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: ```rust 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](./LICENSE). Contributors need to agree that any modifications sent in this repository follow the license.