associated_async_io/
lib.rs

1//! Async IO traits that use futures instead of poll.
2//!
3//! ## Example
4//!
5//! ```rust
6//! #![feature(async_await)]
7//!
8//! use futures::executor::block_on;
9//! use associated_async_io::AsyncIterator;
10//! use futures::future::{self, Future};
11//! use std::pin::Pin;
12//!
13//! #[derive(Debug)]
14//! struct KittenIterator {
15//!     cursor: usize,
16//!     kittens: Vec<String>,
17//! }
18//!
19//! impl KittenIterator {
20//!     fn new(mut kittens: Vec<String>) -> Self {
21//!         kittens.reverse();
22//!         Self { cursor: 0, kittens }
23//!     }
24//! }
25//!
26//! impl AsyncIterator for KittenIterator {
27//!     type Item = String;
28//!     type Fut = Pin<Box<Future<Output = Option<Self::Item>>>>;
29//!     fn next(&mut self) -> Self::Fut {
30//!         self.cursor += 1;
31//!         let kitten = self.kittens.pop();
32//!         Box::pin(future::ready(kitten))
33//!     }
34//! }
35//!
36//! fn main () {
37//!     block_on(async {
38//!         let kittens = vec!["chashu".to_owned(), "nori".to_owned()];
39//!         let mut kittens = KittenIterator::new(kittens);
40//!         AsyncIterator::next(&mut kittens);
41//!     })
42//! }
43//! ```
44
45#![forbid(unsafe_code, future_incompatible, rust_2018_idioms)]
46#![deny(missing_debug_implementations, nonstandard_style)]
47#![warn(missing_docs, missing_doc_code_examples, unreachable_pub)]
48#![cfg_attr(test, deny(warnings))]
49
50use std::future::Future;
51use std::io;
52
53/// Async version of `std::io::Read`.
54pub trait AsyncRead {
55    /// The future returned by `read`.
56    type Fut: Future<Output = io::Result<usize>>;
57    /// Read data.
58    fn read(&mut self, buf: &mut [u8]) -> Self::Fut;
59}
60
61/// Async version of `std::io::Write`.
62pub trait AsyncWrite {
63    /// The future returned by `write`.
64    type Fut: Future<Output = io::Result<usize>>;
65    /// Write data.
66    fn write(&mut self, buf: &[u8]) -> Self::Fut;
67}
68
69/// Async version of `std::iter::Iterator`.
70pub trait AsyncIterator {
71    /// The item returned by `next`.
72    type Item;
73    /// The future returned by `next`.
74    type Fut: Future<Output = Option<Self::Item>>;
75    /// Yield the next item.
76    fn next(&mut self) -> Self::Fut;
77}