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}