#![cfg_attr(
not(test),
deny(
clippy::indexing_slicing,
clippy::unwrap_used,
clippy::expect_used,
clippy::panic,
)
)]
#![warn(missing_docs)]
use std::io::{BufWriter, Result, Write};
#[derive(Debug)]
pub struct BufWriterWithLineEndingFix<W: Write> {
inner: BufWriter<W>,
#[cfg(windows)]
last_written: Option<u8>,
}
impl<W: Write> BufWriterWithLineEndingFix<W> {
pub fn new(inner: W) -> Self {
Self {
inner: BufWriter::with_capacity(4096, inner),
#[cfg(windows)]
last_written: None,
}
}
}
impl<W: Write> Write for BufWriterWithLineEndingFix<W> {
#[cfg(windows)]
fn write(&mut self, buf: &[u8]) -> Result<usize> {
for &b in buf.iter() {
if b == b'\n' && self.last_written != Some(b'\r') {
self.inner.write(b"\r\n")
} else {
self.last_written = Some(b);
self.inner.write(&[b])
}?;
}
Ok(buf.len())
}
#[cfg(not(windows))]
#[inline]
fn write(&mut self, buf: &[u8]) -> Result<usize> {
self.inner.write(buf)
}
#[inline]
fn flush(&mut self) -> Result<()> {
self.inner.flush()
}
}