| 81 | } |
| 82 | impl<W: fmt::Write> fmt::Write for CodeIndenter<W> { |
| 83 | fn write_str(&mut self, s: &str) -> fmt::Result { |
| 84 | for (i, line) in s.split_inclusive('\n').enumerate() { |
| 85 | let write_indent = i != 0 || std::mem::take(&mut self.needs_indenting); |
| 86 | // skip the indent if it's an empty line |
| 87 | if write_indent && line != "\n" { |
| 88 | self.write_indent()?; |
| 89 | } |
| 90 | self.writer.write_str(line)?; |
| 91 | } |
| 92 | self.needs_indenting = s.ends_with('\n'); |
| 93 | Ok(()) |
| 94 | } |
| 95 | } |
| 96 | impl CodeIndenter<String> { |
| 97 | // This method allows `write!` and `writeln!` to be used directly on `CodeIndenter`. |