1pub mod indent {
2 use std::fmt::{self};
3
4 pub struct Indenter<'a, T: ?Sized> {
5 inner: &'a mut T,
6 indentation: &'static str,
7 needs_indent: bool,
8 }
9
10 impl<'a, T: ?Sized> Indenter<'a, T> {
11 pub fn new(f: &'a mut T, indentation: &'static str) -> Self {
12 Self {
13 inner: f,
14 indentation,
15 needs_indent: false,
16 }
17 }
18 }
19
20 impl<T> fmt::Write for Indenter<'_, T>
21 where
22 T: fmt::Write + ?Sized,
23 {
24 fn write_str(&mut self, s: &str) -> fmt::Result {
25 for (idx, line) in s.split('\n').enumerate() {
26 if idx > 0 {
27 self.inner.write_char('\n')?;
28 self.needs_indent = true;
29 }
30
31 if line.is_empty() {
33 continue;
34 }
35
36 if self.needs_indent {
37 write!(self.inner, "{}", self.indentation)?;
38 self.needs_indent = false;
39 }
40
41 write!(self.inner, "{}", line)?;
42 }
43
44 Ok(())
45 }
46 }
47}