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}