pub trait JsonFormatter {
fn after_key(&self) -> &str;
fn after_start_nested(&mut self) -> &str;
fn after_element(&self) -> &str;
fn before_end_nested(&mut self, is_empty: bool) -> &str;
fn indent(&self) -> &str;
}
pub struct CompactFormatter;
impl JsonFormatter for CompactFormatter {
fn after_key(&self) -> &str { "" }
fn after_start_nested(&mut self) -> &str { "" }
fn after_element(&self) -> &str { "" }
fn before_end_nested(&mut self, _is_empty: bool) -> &str { "" }
fn indent(&self) -> &str { "" }
}
pub struct PrettyFormatter {
indent_level: usize,
}
impl PrettyFormatter {
pub fn new() -> PrettyFormatter {
PrettyFormatter {
indent_level: 0,
}
}
}
impl JsonFormatter for PrettyFormatter {
fn after_key(&self) -> &str {
" "
}
fn after_start_nested(&mut self) -> &str {
self.indent_level += 1;
""
}
fn after_element(&self) -> &str {
""
}
fn before_end_nested(&mut self, is_empty: bool) -> &str {
self.indent_level -= 1;
if is_empty {
""
}
else {
self.indent()
}
}
fn indent(&self) -> &str {
static INDENT: &'static str = "\n ";
&INDENT[..2*self.indent_level + 1]
}
}