use crate::error::{TraceSnapshotError, TraceSnapshotRunError, TracedRunError};
use crate::input::RunSeed;
use crate::limits::TraceSnapshotByteLimit;
use crate::trace::{BorrowedTraceEvent, TraceSnapshotEvent};
use super::Program;
use super::result::RunResult;
enum SnapshotTraceCallbackError<E> {
Snapshot(TraceSnapshotError),
Trace(E),
}
impl Program {
pub fn run_with_trace_snapshots<'program, F, E>(
&'program self,
seed: RunSeed,
snapshot_byte_limit: TraceSnapshotByteLimit,
mut trace: F,
) -> Result<RunResult, TraceSnapshotRunError<E>>
where
F: FnMut(TraceSnapshotEvent<'program>) -> Result<(), E>,
{
let result = self.run_with_borrowed_trace(seed, |event| {
let snapshot = event
.to_snapshot(snapshot_byte_limit)
.map_err(SnapshotTraceCallbackError::Snapshot)?;
trace(snapshot).map_err(SnapshotTraceCallbackError::Trace)
});
match result {
Ok(result) => Ok(result),
Err(TracedRunError::Run(error)) => Err(TraceSnapshotRunError::Run(error)),
Err(TracedRunError::Trace(SnapshotTraceCallbackError::Snapshot(error))) => {
Err(TraceSnapshotRunError::Snapshot(error))
}
Err(TracedRunError::Trace(SnapshotTraceCallbackError::Trace(error))) => {
Err(TraceSnapshotRunError::Trace(error))
}
}
}
pub fn run_with_borrowed_trace<'program, F, E>(
&'program self,
seed: RunSeed,
trace: F,
) -> Result<RunResult, TracedRunError<E>>
where
F: for<'run> FnMut(BorrowedTraceEvent<'program, 'run>) -> Result<(), E>,
{
crate::execution::run_with_borrowed_trace(self, seed, trace)
}
}