use std::fmt::Write;
#[derive(Debug)]
pub struct CodeFormatter<'a, F> {
f: &'a mut F,
level: usize,
repeat: String,
indentation: String,
}
impl<'a, F: Write> Write for CodeFormatter<'a, F> {
fn write_str(&mut self, s: &str) -> std::fmt::Result {
write!(self.f, "{}", s.replace('\n', format!("\n{}", self.repeat).as_str()))
}
}
impl<'a, T: Write> CodeFormatter<'a, T> {
pub fn new<S: Into<String>>(f: &'a mut T, indentation: S) -> Self {
Self {
f,
level: 0,
indentation: indentation.into(),
repeat: "".into(),
}
}
pub fn set_level(&mut self, level: usize) {
self.level = level;
self.repeat = self.indentation.repeat(self.level);
}
pub fn indent(&mut self, inc: usize) {
self.level = self.level.saturating_add(inc);
self.repeat += &self.indentation.repeat(inc);
}
pub fn dedent(&mut self, inc: usize) {
self.level = self.level.saturating_sub(inc);
self.repeat = self.indentation.repeat(self.level);
}
}