use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct StreamRuleLedger {
#[serde(default)]
pub turn: u64,
#[serde(default)]
pub fired: BTreeMap<String, u64>,
}
impl StreamRuleLedger {
pub fn is_empty(&self) -> bool {
self.fired.is_empty()
}
pub fn begin_turn(&mut self) {
self.turn = self.turn.saturating_add(1);
}
pub fn last_fired(&self, name: &str) -> Option<u64> {
self.fired.get(name).copied()
}
pub fn record(&mut self, name: &str) {
self.fired.insert(name.to_string(), self.turn);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ledger_tracks_turns_and_hits() {
let mut l = StreamRuleLedger::default();
assert!(l.is_empty());
l.begin_turn();
l.begin_turn();
assert_eq!(l.last_fired("a"), None);
l.record("a");
assert!(!l.is_empty());
assert_eq!(l.last_fired("a"), Some(2));
let back: StreamRuleLedger = serde_json::from_str("{}").unwrap();
assert_eq!(back, StreamRuleLedger::default());
}
}