use crate::engine::types::ExecutionEvent;
use crate::state::types::HarnessEvent;
#[derive(Default)]
pub struct HarnessEventCollector {
events: Vec<HarnessEvent>,
next_sequence: usize,
current_boundary_index: i64,
}
impl HarnessEventCollector {
pub fn new(initial_boundary_index: i64, initial_events: Vec<HarnessEvent>) -> Self {
let next_sequence = initial_events
.iter()
.map(|event| event.sequence)
.max()
.map(|sequence| sequence + 1)
.unwrap_or(0);
Self {
events: initial_events,
next_sequence,
current_boundary_index: initial_boundary_index,
}
}
pub fn observe_engine_event(&mut self, event: &ExecutionEvent) {
if matches!(event, ExecutionEvent::SafeBoundary { .. }) {
self.current_boundary_index += 1;
}
}
pub fn record(&mut self, mut event: HarnessEvent) -> HarnessEvent {
event.sequence = self.next_sequence;
self.next_sequence += 1;
event.boundary_index = Some(self.current_boundary_index);
self.events.push(event.clone());
event
}
pub fn snapshot(&self) -> Vec<HarnessEvent> {
self.events.clone()
}
}