1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
use crate::BufMut; use std::{cmp, io}; /// A `BufMut` adapter which implements `io::Write` for the inner value. /// /// This struct is generally created by calling `writer()` on `BufMut`. See /// documentation of [`writer()`](trait.BufMut.html#method.writer) for more /// details. #[derive(Debug)] pub struct Writer<B> { buf: B, } pub fn new<B>(buf: B) -> Writer<B> { Writer { buf } } impl<B: BufMut> Writer<B> { /// Gets a reference to the underlying `BufMut`. /// /// It is inadvisable to directly write to the underlying `BufMut`. /// /// # Examples /// /// ```rust /// use bytes::buf::BufMutExt; /// /// let mut buf = Vec::with_capacity(1024).writer(); /// /// assert_eq!(1024, buf.get_ref().capacity()); /// ``` pub fn get_ref(&self) -> &B { &self.buf } /// Gets a mutable reference to the underlying `BufMut`. /// /// It is inadvisable to directly write to the underlying `BufMut`. /// /// # Examples /// /// ```rust /// use bytes::buf::BufMutExt; /// /// let mut buf = vec![].writer(); /// /// buf.get_mut().reserve(1024); /// /// assert_eq!(1024, buf.get_ref().capacity()); /// ``` pub fn get_mut(&mut self) -> &mut B { &mut self.buf } /// Consumes this `Writer`, returning the underlying value. /// /// # Examples /// /// ```rust /// use bytes::buf::BufMutExt; /// use std::io; /// /// let mut buf = vec![].writer(); /// let mut src = &b"hello world"[..]; /// /// io::copy(&mut src, &mut buf).unwrap(); /// /// let buf = buf.into_inner(); /// assert_eq!(*buf, b"hello world"[..]); /// ``` pub fn into_inner(self) -> B { self.buf } } impl<B: BufMut + Sized> io::Write for Writer<B> { fn write(&mut self, src: &[u8]) -> io::Result<usize> { let n = cmp::min(self.buf.remaining_mut(), src.len()); self.buf.put(&src[0..n]); Ok(n) } fn flush(&mut self) -> io::Result<()> { Ok(()) } }