use crate::Buf; use std::{cmp, io}; /// A `Buf` adapter which implements `io::Read` for the inner value. /// /// This struct is generally created by calling `reader()` on `Buf`. See /// documentation of [`reader()`](trait.Buf.html#method.reader) for more /// details. #[derive(Debug)] pub struct Reader { buf: B, } pub fn new(buf: B) -> Reader { Reader { buf } } impl Reader { /// Gets a reference to the underlying `Buf`. /// /// It is inadvisable to directly read from the underlying `Buf`. /// /// # Examples /// /// ```rust /// use bytes::Buf; /// /// let buf = b"hello world".reader(); /// /// assert_eq!(b"hello world", buf.get_ref()); /// ``` pub fn get_ref(&self) -> &B { &self.buf } /// Gets a mutable reference to the underlying `Buf`. /// /// It is inadvisable to directly read from the underlying `Buf`. pub fn get_mut(&mut self) -> &mut B { &mut self.buf } /// Consumes this `Reader`, returning the underlying value. /// /// # Examples /// /// ```rust /// use bytes::Buf; /// use std::io; /// /// let mut buf = b"hello world".reader(); /// let mut dst = vec![]; /// /// io::copy(&mut buf, &mut dst).unwrap(); /// /// let buf = buf.into_inner(); /// assert_eq!(0, buf.remaining()); /// ``` pub fn into_inner(self) -> B { self.buf } } impl io::Read for Reader { fn read(&mut self, dst: &mut [u8]) -> io::Result { let len = cmp::min(self.buf.remaining(), dst.len()); Buf::copy_to_slice(&mut self.buf, &mut dst[0..len]); Ok(len) } } impl io::BufRead for Reader { fn fill_buf(&mut self) -> io::Result<&[u8]> { Ok(self.buf.chunk()) } fn consume(&mut self, amt: usize) { self.buf.advance(amt) } }