diff options
author | Haibo Huang <hhb@google.com> | 2021-01-26 20:26:46 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-01-26 20:26:46 +0000 |
commit | 002e162b898f5e57fe5ec8d61457c3bfb8e07864 (patch) | |
tree | 9fee875946571b5e3156284b964bf3617ced0ca1 /src/buf/reader.rs | |
parent | f5494561bf7fbe436f308f71c80ffd669705edd2 (diff) | |
parent | 3f4f1859116e5384ec7c3a13032df3f09cd294e9 (diff) | |
download | bytes-002e162b898f5e57fe5ec8d61457c3bfb8e07864.tar.gz |
Upgrade rust/crates/bytes to 1.0.1 am: 49f37ac424 am: cf355aa8a9 am: 3f4f185911
Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/bytes/+/1546480
MUST ONLY BE SUBMITTED BY AUTOMERGER
Change-Id: Ia91cb5eb0dd4ac50f5f625bbfb326726b7b50646
Diffstat (limited to 'src/buf/reader.rs')
-rw-r--r-- | src/buf/reader.rs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/buf/reader.rs b/src/buf/reader.rs new file mode 100644 index 0000000..f2b4d98 --- /dev/null +++ b/src/buf/reader.rs @@ -0,0 +1,81 @@ +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<B> { + buf: B, +} + +pub fn new<B>(buf: B) -> Reader<B> { + Reader { buf } +} + +impl<B: Buf> Reader<B> { + /// 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<B: Buf + Sized> io::Read for Reader<B> { + fn read(&mut self, dst: &mut [u8]) -> io::Result<usize> { + let len = cmp::min(self.buf.remaining(), dst.len()); + + Buf::copy_to_slice(&mut self.buf, &mut dst[0..len]); + Ok(len) + } +} + +impl<B: Buf + Sized> io::BufRead for Reader<B> { + fn fill_buf(&mut self) -> io::Result<&[u8]> { + Ok(self.buf.chunk()) + } + fn consume(&mut self, amt: usize) { + self.buf.advance(amt) + } +} |