use std::time::Duration;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
pub enum ReadConsistency {
#[default]
Strong,
BoundedStaleness(Duration),
Eventual,
}
impl ReadConsistency {
pub fn requires_leader(&self) -> bool {
matches!(self, ReadConsistency::Strong)
}
pub fn max_staleness(&self) -> Option<Duration> {
match self {
ReadConsistency::BoundedStaleness(d) => Some(*d),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn strong_requires_leader() {
assert!(ReadConsistency::Strong.requires_leader());
}
#[test]
fn bounded_staleness_does_not_require_leader() {
let bs = ReadConsistency::BoundedStaleness(Duration::from_secs(5));
assert!(!bs.requires_leader());
assert_eq!(bs.max_staleness(), Some(Duration::from_secs(5)));
}
#[test]
fn eventual_does_not_require_leader() {
assert!(!ReadConsistency::Eventual.requires_leader());
assert_eq!(ReadConsistency::Eventual.max_staleness(), None);
}
#[test]
fn default_is_strong() {
assert_eq!(ReadConsistency::default(), ReadConsistency::Strong);
}
}