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

#[doc(inline)]
pub use decoder::{Result, Utf8Decoder};
#[doc(inline)]
pub use error::DecodeError;