use alloc::string::String;
use alloc::vec::Vec;
use std::time::SystemTime;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DurabilitySample {
pub topic: String,
pub instance_key: [u8; 16],
pub sequence: u64,
pub payload: Vec<u8>,
pub representation: u8,
pub big_endian: bool,
pub created_at: SystemTime,
pub source_guid: [u8; 16],
pub source_sequence: i64,
}
pub type Cursor = ([u8; 16], u64);
#[derive(Debug, Clone, Default)]
pub struct Selector {
pub instance_key: Option<[u8; 16]>,
pub seq_from: Option<u64>,
pub seq_to: Option<u64>,
pub time_from: Option<SystemTime>,
pub time_to: Option<SystemTime>,
pub after: Option<Cursor>,
pub limit: Option<usize>,
}
impl Selector {
#[must_use]
pub fn after_cursor(&self, cursor: Cursor) -> Self {
Self {
after: Some(cursor),
..self.clone()
}
}
#[must_use]
pub fn matches(&self, sample: &DurabilitySample) -> bool {
if let Some(k) = self.instance_key {
if sample.instance_key != k {
return false;
}
}
if let Some(lo) = self.seq_from {
if sample.sequence < lo {
return false;
}
}
if let Some(hi) = self.seq_to {
if sample.sequence > hi {
return false;
}
}
if let Some(t0) = self.time_from {
if sample.created_at < t0 {
return false;
}
}
if let Some(t1) = self.time_to {
if sample.created_at > t1 {
return false;
}
}
if let Some((ck, cs)) = self.after {
if (sample.instance_key, sample.sequence) <= (ck, cs) {
return false;
}
}
true
}
}
#[derive(Debug, Clone, Default)]
pub struct Page {
pub samples: Vec<DurabilitySample>,
pub next: Option<Cursor>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct StoreStats {
pub samples: usize,
pub instances: usize,
pub bytes: u64,
}