use oxc_data_structures::code_buffer::CodeBuffer;
pub trait Formatter {
const IS_COMPACT: bool;
fn new() -> Self;
fn before_first_element(&mut self, buffer: &mut CodeBuffer);
fn before_later_element(&mut self, buffer: &mut CodeBuffer);
fn before_field_value(&mut self, buffer: &mut CodeBuffer);
fn after_last_element(&mut self, buffer: &mut CodeBuffer);
}
pub struct CompactFormatter;
impl Formatter for CompactFormatter {
const IS_COMPACT: bool = true;
#[inline(always)]
fn new() -> Self {
Self
}
#[inline(always)]
fn before_first_element(&mut self, _buffer: &mut CodeBuffer) {}
#[inline(always)]
fn before_later_element(&mut self, _buffer: &mut CodeBuffer) {}
#[inline(always)]
fn before_field_value(&mut self, _buffer: &mut CodeBuffer) {}
#[inline(always)]
fn after_last_element(&mut self, _buffer: &mut CodeBuffer) {}
}
pub struct PrettyFormatter {
indent: usize,
}
impl Formatter for PrettyFormatter {
const IS_COMPACT: bool = false;
#[inline(always)]
fn new() -> Self {
Self { indent: 0 }
}
fn before_first_element(&mut self, buffer: &mut CodeBuffer) {
self.indent += 1;
self.push_new_line_and_indent(buffer);
}
fn before_later_element(&mut self, buffer: &mut CodeBuffer) {
self.push_new_line_and_indent(buffer);
}
fn before_field_value(&mut self, buffer: &mut CodeBuffer) {
buffer.print_ascii_byte(b' ');
}
fn after_last_element(&mut self, buffer: &mut CodeBuffer) {
self.indent -= 1;
self.push_new_line_and_indent(buffer);
}
}
impl PrettyFormatter {
fn push_new_line_and_indent(&self, buffer: &mut CodeBuffer) {
buffer.print_ascii_byte(b'\n');
buffer.print_indent(self.indent);
}
}