use std::time::Duration;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FlushStrategy {
EveryNPages(usize),
Periodic(Duration),
Async,
Sync,
Never,
Hybrid {
pages: usize,
duration: Duration,
},
}
impl Default for FlushStrategy {
#[inline]
fn default() -> Self {
Self::EveryNPages(4)
}
}
impl FlushStrategy {
#[inline]
pub fn every_n_pages(pages: usize) -> Self {
assert!(pages > 0, "pages must be greater than 0");
Self::EveryNPages(pages)
}
#[inline]
pub fn periodic(duration: Duration) -> Self {
assert!(!duration.is_zero(), "duration must be greater than zero");
Self::Periodic(duration)
}
#[inline]
pub fn hybrid(pages: usize, duration: Duration) -> Self {
assert!(pages > 0, "pages must be greater than 0");
assert!(!duration.is_zero(), "duration must be greater than zero");
Self::Hybrid { pages, duration }
}
#[inline]
pub fn is_sync(&self) -> bool {
matches!(self, Self::Sync)
}
#[inline]
pub fn is_async(&self) -> bool {
matches!(self, Self::Async)
}
#[inline]
pub fn is_never(&self) -> bool {
matches!(self, Self::Never)
}
#[inline]
pub fn name(&self) -> &'static str {
match self {
Self::EveryNPages(_) => "EveryNPages",
Self::Periodic(_) => "Periodic",
Self::Async => "Async",
Self::Sync => "Sync",
Self::Never => "Never",
Self::Hybrid { .. } => "Hybrid",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_strategy() {
let strategy = FlushStrategy::default();
assert!(matches!(strategy, FlushStrategy::EveryNPages(4)));
}
#[test]
fn test_every_n_pages() {
let strategy = FlushStrategy::every_n_pages(8);
assert!(matches!(strategy, FlushStrategy::EveryNPages(8)));
}
#[test]
#[should_panic(expected = "pages must be greater than 0")]
fn test_every_n_pages_zero() {
FlushStrategy::every_n_pages(0);
}
#[test]
fn test_periodic() {
let strategy = FlushStrategy::periodic(Duration::from_millis(100));
assert!(matches!(strategy, FlushStrategy::Periodic(_)));
}
#[test]
#[should_panic(expected = "duration must be greater than zero")]
fn test_periodic_zero() {
FlushStrategy::periodic(Duration::ZERO);
}
#[test]
fn test_hybrid() {
let strategy = FlushStrategy::hybrid(16, Duration::from_millis(200));
assert!(matches!(strategy, FlushStrategy::Hybrid { .. }));
}
#[test]
fn test_is_sync() {
assert!(FlushStrategy::Sync.is_sync());
assert!(!FlushStrategy::Async.is_sync());
}
#[test]
fn test_is_async() {
assert!(FlushStrategy::Async.is_async());
assert!(!FlushStrategy::Sync.is_async());
}
#[test]
fn test_is_never() {
assert!(FlushStrategy::Never.is_never());
assert!(!FlushStrategy::Async.is_never());
}
#[test]
fn test_strategy_names() {
assert_eq!(FlushStrategy::EveryNPages(4).name(), "EveryNPages");
assert_eq!(FlushStrategy::Async.name(), "Async");
assert_eq!(FlushStrategy::Sync.name(), "Sync");
assert_eq!(FlushStrategy::Never.name(), "Never");
}
}