From 128cd393a9e452d834dd5fe9508aef50b5d1bd4b Mon Sep 17 00:00:00 2001 From: "Neal H. Walfield" Date: Sun, 25 Feb 2018 20:43:59 +0100 Subject: buffered-reader: Add a new reader, BufferedReaderEOF. - This reader always returns EOF. This is primarily useful for when we need to mem::replace a reader due to some lifetime issues. --- buffered-reader/src/eof.rs | 112 +++++++++++++++++++++++++++++++++++++++++++++ buffered-reader/src/lib.rs | 2 + 2 files changed, 114 insertions(+) create mode 100644 buffered-reader/src/eof.rs (limited to 'buffered-reader') diff --git a/buffered-reader/src/eof.rs b/buffered-reader/src/eof.rs new file mode 100644 index 00000000..1e7e5a1c --- /dev/null +++ b/buffered-reader/src/eof.rs @@ -0,0 +1,112 @@ +use std::io; +use std::io::Read; +use std::fmt; + +use BufferedReader; + +/// A `BufferedReaderEOF` always returns EOF. +pub struct BufferedReaderEOF { + cookie: C, +} + +impl fmt::Debug for BufferedReaderEOF { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("BufferedReaderEOF") + .finish() + } +} + +impl BufferedReaderEOF<()> { + pub fn new() -> Self { + BufferedReaderEOF { + cookie: (), + } + } +} + +impl BufferedReaderEOF { + pub fn with_cookie(cookie: C) -> Self { + BufferedReaderEOF { + cookie: cookie, + } + } +} + +impl Read for BufferedReaderEOF { + fn read(&mut self, _buf: &mut [u8]) -> Result { + return Ok(0); + } +} + +impl BufferedReader for BufferedReaderEOF { + fn buffer(&self) -> &[u8] { + return &b""[..]; + } + + fn data(&mut self, _amount: usize) -> Result<&[u8], io::Error> { + return Ok(&b""[..]); + } + + fn consume(&mut self, amount: usize) -> &[u8] { + assert_eq!(amount, 0); + return &b""[..]; + } + + fn data_consume(&mut self, amount: usize) -> Result<&[u8], io::Error> { + assert_eq!(amount, 0); + return Ok(&b""[..]); + } + + fn data_consume_hard(&mut self, amount: usize) -> Result<&[u8], io::Error> { + assert_eq!(amount, 0); + return Ok(&b""[..]); + } + + fn into_inner<'a>(self: Box) -> Option + 'a>> + where Self: 'a + { + return None; + } + + fn get_mut(&mut self) -> Option<&mut BufferedReader> + { + return None; + } + + fn get_ref(&self) -> Option<&BufferedReader> + { + return None; + } + + + fn cookie_set(&mut self, cookie: C) -> C { + use std::mem; + + mem::replace(&mut self.cookie, cookie) + } + + fn cookie_ref(&self) -> &C { + &self.cookie + } + + fn cookie_mut(&mut self) -> &mut C { + &mut self.cookie + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn basics() { + let mut reader = BufferedReaderEOF::new(); + + assert_eq!(reader.buffer(), &b""[..]); + assert_eq!(reader.data(100).unwrap(), &b""[..]); + assert_eq!(reader.buffer(), &b""[..]); + assert_eq!(reader.consume(0), &b""[..]); + assert_eq!(reader.data_hard(0).unwrap(), &b""[..]); + assert!(reader.data_hard(1).is_err()); + } +} diff --git a/buffered-reader/src/lib.rs b/buffered-reader/src/lib.rs index aef5c897..0660f729 100644 --- a/buffered-reader/src/lib.rs +++ b/buffered-reader/src/lib.rs @@ -11,11 +11,13 @@ use std::fmt; mod generic; mod memory; mod limitor; +mod eof; mod decompress; pub use self::generic::BufferedReaderGeneric; pub use self::memory::BufferedReaderMemory; pub use self::limitor::BufferedReaderLimitor; +pub use self::eof::BufferedReaderEOF; pub use self::decompress::BufferedReaderDeflate; pub use self::decompress::BufferedReaderZlib; pub use self::decompress::BufferedReaderBzip; -- cgit v1.2.3