async_utf8_decoder/lib.rs
1//! # Asynchronous and incremental UTF-8 decoder
2//!
3//! `async-utf8-decoder` crate provides `Utf8Decoder` which allows to convert any object which
4//! implements `AsyncRead` trait into a string stream which implements `Stream` trait.
5//!
6//! ## Example
7//!
8//! ```
9//! # use anyhow::{anyhow, Result};
10//! # use futures::prelude::*;
11//! # use futures::executor;
12//! # async fn timeout<T>(future: impl Future<Output = T> + Unpin) -> Result<T> {
13//! # let mut future = future.fuse();
14//! # let mut sleep = futures_timer::Delay::new(std::time::Duration::from_millis(100)).fuse();
15//! # futures::select! {
16//! # r = future => Ok(r),
17//! # _ = sleep => Err(anyhow!("Timeout")),
18//! # }
19//! # }
20//! # fn main() -> Result<()> {
21//! # executor::block_on(async {
22//! use futures::io;
23//! use futures::channel::mpsc;
24//! use async_utf8_decoder::Utf8Decoder;
25//!
26//! let (mut tx, rx) = mpsc::unbounded::<io::Result<Vec<u8>>>();
27//! let mut decoder = Utf8Decoder::new(rx.into_async_read());
28//!
29//! tx.send(Ok(vec![240])).await?;
30//! assert!(timeout(decoder.next()).await.is_err());
31//! tx.send(Ok(vec![159])).await?;
32//! assert!(timeout(decoder.next()).await.is_err());
33//! tx.send(Ok(vec![146])).await?;
34//! assert!(timeout(decoder.next()).await.is_err());
35//! tx.send(Ok(vec![150])).await?;
36//! assert_eq!("💖", timeout(decoder.next()).await?.unwrap()?);
37//! assert!(timeout(decoder.next()).await.is_err());
38//! # Ok(()) as Result<()>
39//! # })?;
40//! # Ok(())
41//! # }
42//! ```
43//!
44pub mod decoder;
45pub mod error;
46
47#[doc(inline)]
48pub use decoder::{Result, Utf8Decoder};
49#[doc(inline)]
50pub use error::DecodeError;