use super::Buffer;
pub trait Formatter {
fn new() -> Self;
fn before_first_element(&mut self, buffer: &mut Buffer);
fn before_later_element(&mut self, buffer: &mut Buffer);
fn before_field_value(&mut self, buffer: &mut Buffer);
fn after_last_element(&mut self, buffer: &mut Buffer);
}
pub struct CompactFormatter;
impl Formatter for CompactFormatter {
#[inline(always)]
fn new() -> Self {
Self
}
#[inline(always)]
fn before_first_element(&mut self, _buffer: &mut Buffer) {}
#[inline(always)]
fn before_later_element(&mut self, _buffer: &mut Buffer) {}
#[inline(always)]
fn before_field_value(&mut self, _buffer: &mut Buffer) {}
#[inline(always)]
fn after_last_element(&mut self, _buffer: &mut Buffer) {}
}
pub struct PrettyFormatter {
indent: usize,
}
impl Formatter for PrettyFormatter {
#[inline(always)]
fn new() -> Self {
Self { indent: 0 }
}
fn before_first_element(&mut self, buffer: &mut Buffer) {
self.indent += 1;
self.push_new_line_and_indent(buffer);
}
fn before_later_element(&mut self, buffer: &mut Buffer) {
self.push_new_line_and_indent(buffer);
}
fn before_field_value(&mut self, buffer: &mut Buffer) {
buffer.push_ascii_byte(b' ');
}
fn after_last_element(&mut self, buffer: &mut Buffer) {
self.indent -= 1;
self.push_new_line_and_indent(buffer);
}
}
impl PrettyFormatter {
fn push_new_line_and_indent(&self, buffer: &mut Buffer) {
buffer.push_ascii_byte(b'\n');
unsafe { buffer.push_bytes(&b" ".repeat(self.indent)) };
}
}