use crate::store::EventStore;
use crate::types::EventEnvelope;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
use tracing::debug;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ReplayGap {
pub from: u64,
pub to: u64,
}
impl ReplayGap {
pub fn len(&self) -> u64 {
self.to.saturating_sub(self.from) + 1
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
pub struct ReplayEngine {
store: Arc<EventStore>,
}
impl ReplayEngine {
pub fn new(store: Arc<EventStore>) -> Self {
Self { store }
}
pub fn replay(
&self,
from_sequence: u64,
limit: usize,
) -> Result<Vec<EventEnvelope>, crate::error::EventError> {
debug!(from = from_sequence, limit, "replaying events");
self.store.query_from(from_sequence, limit)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_replay_gap_len() {
let gap = ReplayGap { from: 5, to: 10 };
assert_eq!(gap.len(), 6);
assert!(!gap.is_empty());
}
}