peekread

Crates.iopeekread
lib.rspeekread
version0.1.1
sourcesrc
created_at2021-08-01 08:52:22.84851
updated_at2021-08-01 09:02:04.000565
descriptionAllows peeking ahead in Read streams
homepage
repositoryhttps://github.com/orlp/peekread
max_upload_size
id429944
size35,830
Orson Peters (orlp)

documentation

README

peekread

This crate allows you to take an arbitrary Read stream and 'peek ahead' into the stream without consuming the original stream. This is done through the PeekRead trait which has the method peek. When this method is called it returns a new PeekCursor object implementing Read, BufRead and Seek that allows you to read from the stream without affecting the original stream. The PeekRead trait is directly implemented on a select few types, but for most you will have to wrap your type in a SeekPeekReader or BufPeekReader that implements the peeking behavior using respectively seeking or buffering. Please refer to the the documentation for more information.

The minimum required stable Rust version for peekread is 1.31.0. To start using peekread add the following to your Cargo.toml:

[dependencies]
peekread = "0.1"

Example

A short example:

use peekread::{PeekRead, SeekPeekReader};

let mut f = SeekPeekReader::new(File::open("ambiguous")?);

// HTML is so permissive its parser never fails, so check for signature.
if f.starts_with("<!DOCTYPE") {
    Ok(ParseResult::Html(parse_as_html(f)))
} else {
    // Can pass PeekCursor to functions accepting T: Read without them
    // having to be aware of peekread.
    parse_as_jpg(f.peek()).map(ParseResult::Jpg)
       .or_else(|_| parse_as_png(f.peek()).map(ParseResult::Png))
       .or_else(|_| parse_as_gif(f.peek()).map(ParseResult::Gif))
       .or_else(|_| parse_as_javascript(f.peek()).map(ParseResult::Js))
}

License

peekread is released under the Zlib license, a permissive license. It is OSI and FSF approved and GPL compatible.

Commit count: 30

cargo fmt