mod shim;
use core::fmt;
use self::shim::LineWriterShim;
use crate::{BufWriter, IntoInnerError, IoBufMut, Result, Write};
pub struct LineWriter<W: ?Sized + Write> {
inner: BufWriter<W>,
}
impl<W: Write> LineWriter<W> {
pub fn new(inner: W) -> LineWriter<W> {
LineWriter {
inner: BufWriter::new(inner),
}
}
#[cfg(feature = "alloc")]
pub fn with_capacity(capacity: usize, inner: W) -> LineWriter<W> {
LineWriter {
inner: BufWriter::with_capacity(capacity, inner),
}
}
#[cfg_attr(not(feature = "alloc"), allow(clippy::result_large_err))]
pub fn into_inner(self) -> core::result::Result<W, IntoInnerError<LineWriter<W>>> {
self.inner
.into_inner()
.map_err(|err| err.new_wrapped(|inner| LineWriter { inner }))
}
}
impl<W: ?Sized + Write> LineWriter<W> {
pub fn get_ref(&self) -> &W {
self.inner.get_ref()
}
pub fn get_mut(&mut self) -> &mut W {
self.inner.get_mut()
}
}
impl<W: ?Sized + Write> Write for LineWriter<W> {
fn write(&mut self, buf: &[u8]) -> Result<usize> {
LineWriterShim::new(&mut self.inner).write(buf)
}
fn flush(&mut self) -> Result<()> {
self.inner.flush()
}
fn write_all(&mut self, buf: &[u8]) -> Result<()> {
LineWriterShim::new(&mut self.inner).write_all(buf)
}
fn write_fmt(&mut self, fmt: fmt::Arguments<'_>) -> Result<()> {
LineWriterShim::new(&mut self.inner).write_fmt(fmt)
}
}
impl<W: ?Sized + Write + fmt::Debug> fmt::Debug for LineWriter<W> {
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt.debug_struct("LineWriter")
.field("writer", &self.get_ref())
.field(
"buffer",
&format_args!("{}/{}", self.inner.buffer().len(), self.inner.capacity()),
)
.finish_non_exhaustive()
}
}
impl<W: ?Sized + Write + IoBufMut> IoBufMut for LineWriter<W> {
#[inline]
fn remaining_mut(&self) -> usize {
self.inner.remaining_mut()
}
}