use crate::*;
use pulldown_cmark::Event;
use std::cmp::Ordering;
use std::mem;
#[derive(Default)]
pub(crate) struct EventBuffer<'a> {
buf: Vec<Event<'a>>,
nest_lv: u32,
}
impl<'a> EventBuffer<'a> {
pub fn new() -> Self {
Default::default()
}
pub fn input(&mut self, event: Event<'a>) -> Option<Vec<Event<'a>>> {
debug_assert!((self.nest_lv == 0) == self.buf.is_empty());
let nest_up = match &event {
Event::Start(_) => 1,
Event::End(_) => -1,
_ => 0,
};
let Some(nest_lv) = self.nest_lv.checked_add_signed(nest_up) else {
panic!(
"{}",
match nest_up.cmp(&0) {
Ordering::Equal => unreachable!(),
Ordering::Less => msg::EVENT_NEST_LV_UNDERFLOW,
Ordering::Greater => msg::EVENT_NEST_LV_OVERFLOW,
}
)
};
self.buf.push(event);
self.nest_lv = nest_lv;
if self.nest_lv == 0 {
let old_buf = mem::take(&mut self.buf);
return Some(old_buf);
}
None
}
}