use crate::error::WriteResult;
use ecow::EcoString;
#[derive(Debug, Default, Clone, Copy)]
pub(crate) struct FormatPolicy;
impl FormatPolicy {
pub fn ensure_trailing_newline(&mut self, buffer: &mut EcoString) -> WriteResult<()> {
if !buffer.ends_with('\n') {
buffer.push('\n');
}
Ok(())
}
pub fn ensure_blank_line(&mut self, buffer: &mut EcoString) -> WriteResult<()> {
self.ensure_trailing_newline(buffer)?;
if trailing_newline_count(buffer) < 2 {
buffer.push('\n');
}
Ok(())
}
pub fn prepare_block_sequence(
&mut self,
buffer: &mut EcoString,
previous_was_block: bool,
next_is_block: bool,
) -> WriteResult<()> {
if previous_was_block && next_is_block {
self.ensure_blank_line(buffer)
} else if previous_was_block || next_is_block {
self.ensure_trailing_newline(buffer)
} else {
Ok(())
}
}
}
fn trailing_newline_count(buffer: &EcoString) -> usize {
buffer.chars().rev().take_while(|&ch| ch == '\n').count()
}