pub fn format(input: &str) -> String {
let input = input.trim();
let mut out = String::new();
let mut last: Option<char> = None;
let mut space = true; let mut beginning_of_line = true;
let mut open_brace = false; let mut open_brace_written = false; let mut open_brace_space = false;
let mut new_lines: usize = 0;
let mut comment = false; let mut quoted = false; let mut escaped = false;
let mut nesting = 0;
macro_rules! write {
($ch:expr) => {
out.push($ch);
#[allow(unused_assignments)]
{
last = Some($ch);
}
};
}
macro_rules! indent {
() => {
for _ in 0..nesting {
write!('\t');
}
};
}
macro_rules! next_line {
() => {
write!('\n');
beginning_of_line = true;
};
($n:expr) => {
for _ in 0..$n {
write!('\n');
}
if $n > 0 {
beginning_of_line = true;
}
};
}
for ch in input.chars() {
if comment {
if ch == '\n' {
comment = false;
space = true;
next_line!();
continue;
} else {
write!(ch);
continue;
}
}
if !escaped && ch == '\\' {
if space {
write!(' ');
space = false;
}
write!(ch);
escaped = true;
continue;
}
if escaped {
write!(ch);
escaped = false;
continue;
}
if quoted {
if ch == '"' {
quoted = false;
}
write!(ch);
continue;
}
if space && ch == '"' {
quoted = true
}
if ch.is_whitespace() {
space = true;
if ch == '\n' {
new_lines += 1;
}
continue;
};
let space_prior = space;
space = false;
if ch == '#' {
comment = true
}
if open_brace && space_prior && !open_brace_written {
if nesting == 0 && last == Some('}') {
next_line!(2);
}
open_brace = false;
if beginning_of_line {
indent!();
} else if !open_brace_space {
write!(' ');
}
write!('{');
open_brace_written = true;
next_line!();
new_lines = 0;
if nesting < 10 {
nesting += 1;
}
}
match ch {
'{' => {
open_brace = true;
open_brace_written = false;
open_brace_space = space_prior && !beginning_of_line;
if open_brace_space {
write!(' ');
}
continue;
}
'}' if space_prior || !open_brace => {
if last != Some('\n') {
next_line!();
}
if nesting > 0 {
nesting -= 1;
}
indent!();
write!('}');
new_lines = 0;
continue;
}
_ => {}
}
if new_lines > 2 {
new_lines = 2
}
next_line!(new_lines);
new_lines = 0;
if beginning_of_line {
indent!();
}
if nesting == 0 && last == Some('}') && beginning_of_line {
next_line!(2);
}
if !beginning_of_line && space_prior {
write!(' ');
}
if open_brace && !open_brace_written {
write!('{');
open_brace_written = true;
}
write!(ch);
beginning_of_line = false;
}
let out = out.trim().to_string();
out + "\n"
}