use crate::replay::{
RecordedDeliveryKind, RecordedMessageDelivery, RecordedSchedule, ReplayEvent, ReplayLog,
};
use crate::term::Term;
#[derive(Clone, Debug, Default)]
pub struct ReplayRecorder {
next_delivery_order: u64,
events: Vec<ReplayEvent>,
}
impl ReplayRecorder {
#[must_use]
pub const fn new() -> Self {
Self {
next_delivery_order: 0,
events: Vec::new(),
}
}
pub fn record_message_delivery(
&mut self,
kind: RecordedDeliveryKind,
sender_pid: Option<u64>,
receiver_pid: u64,
sender_clock: u64,
receiver_clock: u64,
message: Term,
) -> RecordedMessageDelivery {
let recorded = RecordedMessageDelivery {
order: self.next_delivery_order,
kind,
sender_pid,
receiver_pid,
sender_clock,
receiver_clock,
message,
};
self.next_delivery_order = self.next_delivery_order.saturating_add(1);
self.events.push(ReplayEvent::MessageDelivery(recorded));
recorded
}
pub fn record_schedule(
&mut self,
pid: u64,
scheduler_index: usize,
reduction_budget: u32,
reductions_consumed: u32,
) -> RecordedSchedule {
let recorded = RecordedSchedule {
pid,
scheduler_index,
reduction_budget,
reductions_consumed,
};
self.events.push(ReplayEvent::Schedule(recorded));
recorded
}
#[must_use]
pub fn events(&self) -> &[ReplayEvent] {
&self.events
}
#[must_use]
pub fn into_log(self) -> ReplayLog {
ReplayLog::new(self.events)
}
}