mirror of
https://github.com/tokio-rs/bytes.git
synced 2026-08-10 00:00:09 +02:00
89 lines
2.0 KiB
Rust
89 lines
2.0 KiB
Rust
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(())
|
|
}
|
|
}
|