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