async_pipe/lib.rs
1//! Creates an asynchronous piped reader and writer pair using `tokio.rs`.
2//!
3//! # Examples
4//!
5//! ```
6//! # async fn run() {
7//! use async_pipe;
8//! use tokio::prelude::*;
9//!
10//! let (mut w, mut r) = async_pipe::pipe();
11//!
12//! tokio::spawn(async move {
13//! w.write_all(b"hello world").await.unwrap();
14//! });
15//!
16//! let mut v = Vec::new();
17//! r.read_to_end(&mut v).await.unwrap();
18//!
19//! println!("Received: {:?}", String::from_utf8(v));
20//! # }
21//!
22//! tokio::runtime::Runtime::new().unwrap().block_on(run());
23//! ```
24
25use state::State;
26use std::sync::{Arc, Mutex};
27
28pub use self::reader::PipeReader;
29pub use self::writer::PipeWriter;
30
31mod reader;
32mod state;
33mod writer;
34
35/// Creates a piped pair of an [`AsyncWrite`](https://docs.rs/tokio/0.2.16/tokio/io/trait.AsyncWrite.html) and an [`AsyncRead`](https://docs.rs/tokio/0.2.15/tokio/io/trait.AsyncRead.html).
36pub fn pipe() -> (PipeWriter, PipeReader) {
37 let shared_state = Arc::new(Mutex::new(State {
38 reader_waker: None,
39 writer_waker: None,
40 data: None,
41 done_reading: false,
42 read: 0,
43 done_cycle: true,
44 closed: false,
45 }));
46
47 let w = PipeWriter {
48 state: Arc::clone(&shared_state),
49 };
50
51 let r = PipeReader {
52 state: Arc::clone(&shared_state),
53 };
54
55 (w, r)
56}