o7 0.1.1

O7 workflow DSL runner
Documentation
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()
    }
}