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;