use std::io::{Result as IoResult, Write};
pub struct PadAdapter<'a> {
buf: &'a mut (dyn Write + 'a),
on_newline: bool,
}
impl<'a> PadAdapter<'a> {
pub(crate) fn wrap<'fmt: 'a>(buf: &'fmt mut (dyn Write + 'a)) -> Self {
PadAdapter {
buf,
on_newline: true,
}
}
}
impl Write for PadAdapter<'_> {
fn write(&mut self, mut s: &[u8]) -> IoResult<usize> {
let len = s.len();
while !s.is_empty() {
if self.on_newline {
self.buf.write_all(b" ")?;
}
let split = if let Some(pos) = s.iter().position(|&v| v == b'\n') {
self.on_newline = true;
pos.checked_add(1).expect("newline position overflowed")
} else {
self.on_newline = false;
s.len()
};
self.buf.write_all(&s[..split])?;
s = &s[split..];
}
Ok(len)
}
fn flush(&mut self) -> IoResult<()> {
Ok(())
}
}