use std::cell::RefCell;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum GovernedArm {
Admitted,
CacheHit,
Refused,
Ineligible,
}
#[derive(Clone, Debug)]
pub struct GovernedDecision {
pub context: String,
pub nrows: usize,
pub ncols: usize,
pub bytes: Option<usize>,
pub arm: GovernedArm,
}
thread_local! {
static CAPTURE: RefCell<Option<Vec<GovernedDecision>>> = const { RefCell::new(None) };
}
pub fn begin_governed_decision_capture() {
CAPTURE.with(|slot| *slot.borrow_mut() = Some(Vec::new()));
}
pub fn take_governed_decision_capture() -> Option<Vec<GovernedDecision>> {
CAPTURE.with(|slot| slot.borrow_mut().take())
}
pub(crate) fn record_governed_decision(
context: &str,
nrows: usize,
ncols: usize,
bytes: Option<usize>,
arm: GovernedArm,
) {
CAPTURE.with(|slot| {
if let Ok(mut borrowed) = slot.try_borrow_mut()
&& let Some(decisions) = borrowed.as_mut()
{
decisions.push(GovernedDecision {
context: context.to_string(),
nrows,
ncols,
bytes,
arm,
});
}
});
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn capture_distinguishes_never_started_from_never_reached() {
assert!(
take_governed_decision_capture().is_none(),
"with no capture started, the result must be None, not an empty window"
);
begin_governed_decision_capture();
let reached = take_governed_decision_capture();
assert_eq!(
reached.map(|decisions| decisions.len()),
Some(0),
"a started-but-unreached window must be Some(empty), which is the \
evidence that distinguishes an interpretable null from an unknown"
);
}
#[test]
fn decisions_record_in_order_with_their_arm() {
begin_governed_decision_capture();
record_governed_decision("first site", 4, 3, Some(96), GovernedArm::Admitted);
record_governed_decision("second site", 8, 2, None, GovernedArm::Refused);
let decisions = take_governed_decision_capture().expect("capture was started");
assert_eq!(decisions.len(), 2);
assert_eq!(decisions[0].context, "first site");
assert_eq!(decisions[0].arm, GovernedArm::Admitted);
assert_eq!(decisions[0].bytes, Some(96));
assert_eq!(decisions[1].context, "second site");
assert_eq!(decisions[1].arm, GovernedArm::Refused);
assert_eq!(decisions[1].nrows, 8);
assert!(take_governed_decision_capture().is_none());
}
#[test]
fn recording_without_capture_is_silent() {
record_governed_decision("ignored", 1, 1, Some(8), GovernedArm::Admitted);
assert!(
take_governed_decision_capture().is_none(),
"recording while off must not implicitly open a window"
);
}
}