From 5404fa656ea9b96fb6431e17fe11f30c167d9426 Mon Sep 17 00:00:00 2001 From: Michal 'vorner' Vaner Date: Fri, 16 Nov 2018 21:56:19 +0100 Subject: [PATCH] The Reader can implement BufReader naturally 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 59f9c3304..f1154dace 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 000000000..7103f3592 --- /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); +}