2 releases

0.1.1 Aug 1, 2021
0.1.0 Aug 1, 2021

#10 in #peek

Download history 55/week @ 2024-01-01 88/week @ 2024-01-08 42/week @ 2024-01-15 56/week @ 2024-01-22 89/week @ 2024-01-29 52/week @ 2024-02-05 119/week @ 2024-02-12 100/week @ 2024-02-19 181/week @ 2024-02-26 120/week @ 2024-03-04 91/week @ 2024-03-11 116/week @ 2024-03-18 134/week @ 2024-03-25 120/week @ 2024-04-01 81/week @ 2024-04-08 85/week @ 2024-04-15

433 downloads per month
Used in 8 crates (4 directly)

Zlib license

35KB
660 lines

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.

No runtime deps