temply/
__intern.rs

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                // Skip empty lines
32                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}