use std::{fmt, fmt::Write};
pub struct Indent<T>(pub T);
impl<T: fmt::Display> fmt::Display for Indent<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(IndentWriter { f, new_line: true }, "{}", self.0)
}
}
const SPACES: &str = " ";
struct IndentWriter<'a, 'b> {
new_line: bool,
f: &'b mut fmt::Formatter<'a>,
}
impl Write for IndentWriter<'_, '_> {
fn write_str(&mut self, s: &str) -> fmt::Result {
let mut iter = s.lines().peekable();
while let Some(line) = iter.next() {
if self.new_line {
self.f.write_str(SPACES)?;
}
self.f.write_str(line)?;
if iter.peek().is_some() || s.ends_with('\n') {
self.f.write_str("\n")?;
self.new_line = true;
} else {
self.new_line = false;
}
}
Ok(())
}
}