From 7c3085aaec243feb26ee4ebe867b0acac6b62d3b Mon Sep 17 00:00:00 2001 From: Michal 'vorner' Vaner Date: Sat, 17 Nov 2018 16:51:41 +0100 Subject: [PATCH] The Reader can implement BufReader naturally (#232) There's no reason the user should be forced to wrap it in BufReader in case the trait is needed, because the Reader has all the bits for supporting it naturally. --- src/buf/reader.rs | 9 +++++++++ tests/test_reader.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 tests/test_reader.rs diff --git a/src/buf/reader.rs b/src/buf/reader.rs index 59f9c33..f1154da 100644 --- a/src/buf/reader.rs +++ b/src/buf/reader.rs @@ -86,3 +86,12 @@ impl io::Read for Reader { Ok(len) } } + +impl io::BufRead for Reader { + fn fill_buf(&mut self) -> io::Result<&[u8]> { + Ok(self.buf.bytes()) + } + fn consume(&mut self, amt: usize) { + self.buf.advance(amt) + } +} diff --git a/tests/test_reader.rs b/tests/test_reader.rs new file mode 100644 index 0000000..7103f35 --- /dev/null +++ b/tests/test_reader.rs @@ -0,0 +1,28 @@ +extern crate bytes; + +use std::io::{BufRead, Cursor, Read}; + +use bytes::Buf; + +#[test] +fn read() { + let buf1 = Cursor::new(b"hello "); + let buf2 = Cursor::new(b"world"); + let buf = Buf::chain(buf1, buf2); // Disambiguate with Read::chain + let mut buffer = Vec::new(); + buf.reader().read_to_end(&mut buffer).unwrap(); + assert_eq!(b"hello world", &buffer[..]); +} + +#[test] +fn buf_read() { + let buf1 = Cursor::new(b"hell"); + let buf2 = Cursor::new(b"o\nworld"); + let mut reader = Buf::chain(buf1, buf2).reader(); + let mut line = String::new(); + reader.read_line(&mut line).unwrap(); + assert_eq!("hello\n", &line); + line.clear(); + reader.read_line(&mut line).unwrap(); + assert_eq!("world", &line); +}