#reader #peek #wrapper #invariants

peekable_reader

提供围绕Readers的实用包装,允许客户端预览即将到来的字节,而无需消耗它

2个版本

使用旧Rust 2015

0.0.2 2015年1月30日
0.0.1 2015年1月10日

#22 in #invariants

MIT许可证

15KB
221

peekable-reader-rs

Build Status

一个Rust的实用结构体:任何Reader的包装器,允许执行peek操作,以及常规的Reader方法。

用法

目前,PeekableReader公开了一个额外的单个方法:fn peek_byte(&mut self) -> IoResult<u8>,这与由Reader特质公开的read_byte方法类似,返回下一个read_byte将返回的结果。这允许客户端检查下一次读取操作的结果,而实际上并不消耗输入中的字节。

错误语义是这样的,即当在执行peek操作时,底层的包装Reader抛出的任何错误都会在随后的读取方法调用中返回,这样就可以保持peek_byte的结果始终与接下来的read_byte操作的结果相同。

由于PeekableReader也实现了Reader特质,因此它可以无缝地插入任何其他Reader实现可以插入的地方。

// Wrap any `Reader` instance into a PeekableReader.
let mut peekable_reader = PeekableReader::new(MemReader::new(vec![1, 2, 3]));
// Now we can peek at the next byte, without consuming it...
let b = peekable_reader.peek_byte();
// Multiple calls of `peek_byte` before a read always return the same result
assert!(peekable_reader.peek_byte() == b);
// ...the result of the `peek_byte` is always exactly what the next
// `read_byte` call returns.
assert!(peekable_reader.read_byte() == b);
assert!(b.unwrap() == 1);

// A peeked byte is always correctly included in a read, regardless of which
// flavor of read is used from the `Reader` trait.
let _ = peekable_reader.peek_byte();
// (e.g. read into a buffer)
let mut buffer: Vec<u8> = vec![0, 0];
peekable_reader.read(buffer.as_mut_slice());
assert_eq!(vec![2, 3], buffer);

// Peeking at the end returns an EOF
assert!(match peekable_reader.peek_byte() {
    Err(IoError { kind: IoErrorKind::EndOfFile, .. }) => true,
    _ => false,
});

许可证

MIT

无运行时依赖