use std::cell::RefCell;
use dotzuki_engine::battle::stack::{EffectId, Event, RelayVar};
use crate::model::Op;
#[derive(Debug, Clone, PartialEq)]
pub struct TraceEvent {
pub effect: EffectId,
pub event: Event,
pub op: Op,
pub before: RelayVar,
pub after: RelayVar,
}
#[derive(Debug, Default, Clone)]
pub struct TraceSink {
pub events: Vec<TraceEvent>,
}
thread_local! {
static SINK: RefCell<Option<TraceSink>> = const { RefCell::new(None) };
}
pub fn enable_trace() {
SINK.with(|s| *s.borrow_mut() = Some(TraceSink::default()));
}
pub fn take_trace() -> Option<TraceSink> {
SINK.with(|s| s.borrow_mut().take())
}
pub(crate) fn record(effect: EffectId, event: Event, op: &Op, before: RelayVar, after: RelayVar) {
SINK.with(|s| {
if let Some(sink) = s.borrow_mut().as_mut() {
sink.events.push(TraceEvent {
effect,
event,
op: op.clone(),
before,
after,
});
}
});
}