pub struct Recorder { /* private fields */ }Expand description
Append-only recorder. Writes the session header once, then one JSONL
line per Msg the main loop feeds the reducer.
Implementations§
Source§impl Recorder
impl Recorder
Sourcepub fn open(path: impl Into<PathBuf>) -> Result<Self>
pub fn open(path: impl Into<PathBuf>) -> Result<Self>
Open path for append. Creates the file if it doesn’t exist.
Sourcepub fn record_header(&mut self, header: &SessionHeader) -> Result<()>
pub fn record_header(&mut self, header: &SessionHeader) -> Result<()>
Write the session header. Called once, before the first record_msg,
and flushed immediately — a replay of a crashed session should still
find a parseable header.
Sourcepub fn record_msg(&mut self, now: DateTime<Local>, msg: &Msg) -> Result<()>
pub fn record_msg(&mut self, now: DateTime<Local>, msg: &Msg) -> Result<()>
Record one reducer input. now must be the same value the driver
stamps into state.now for this tick — that identity is what makes
the recorded ts a faithful replay clock.
Msg::Tick is deliberately NOT recorded: the reducer’s Tick arm is a
documented no-op (render derives the spinner from state.now), so a
60 Hz tick stream would bloat the log by megabytes per hour for zero
replay fidelity. The tick_is_a_reducer_noop invariant test pins
this — if Tick ever grows state effects, that test fails and ticks
must be recorded again. Old logs containing Tick entries still fold
fine (a no-op replays as a no-op).
Sourcepub fn record_trailer(
&mut self,
now: DateTime<Local>,
session: &Session,
) -> Result<()>
pub fn record_trailer( &mut self, now: DateTime<Local>, session: &Session, ) -> Result<()>
Seal the recording with a fingerprint of the final session state, so
a future --replay can verify its fold reproduces what this live
session actually saw (not merely that the fold is self-consistent).
Written on clean exit; a crashed session simply has no trailer.
pub fn flush(&mut self) -> Result<()>
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Recorder
impl RefUnwindSafe for Recorder
impl Send for Recorder
impl Sync for Recorder
impl Unpin for Recorder
impl UnsafeUnpin for Recorder
impl UnwindSafe for Recorder
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more