1use crate::BufMut;
2
3use 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)]
11pub struct Writer<B> {
12 buf: B,
13}
14
15pub fn new<B>(buf: B) -> Writer<B> {
16 Writer { buf }
17}
18
19impl<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 /// ```
33 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 /// ```
52 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 /// ```
72 pub fn into_inner(self) -> B {
73 self.buf
74 }
75}
76
77impl<B: BufMut + Sized> io::Write for Writer<B> {
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
85 fn flush(&mut self) -> io::Result<()> {
86 Ok(())
87 }
88}
89