use crate::journal::JournalHandle;
use crate::Result;
use std::path::Path;
pub(crate) const DEFAULT_LOG_BUFFER_KIB: u32 = 64;
pub(crate) const MIN_LOG_BUFFER_BYTES: u32 = 4 * 1024;
pub(crate) const MAX_LOG_BUFFER_BYTES: u32 = 64 * 1024 * 1024;
#[derive(Debug, Clone)]
#[must_use]
pub struct JournalOptions {
pub(crate) direct: bool,
pub(crate) log_buffer_kib: u32,
}
impl Default for JournalOptions {
fn default() -> Self {
Self::new()
}
}
impl JournalOptions {
pub fn new() -> Self {
Self {
direct: false,
log_buffer_kib: DEFAULT_LOG_BUFFER_KIB,
}
}
pub fn direct(mut self, yes: bool) -> Self {
self.direct = yes;
self
}
pub fn log_buffer_kib(mut self, kib: u32) -> Self {
self.log_buffer_kib = kib.clamp(MIN_LOG_BUFFER_BYTES / 1024, MAX_LOG_BUFFER_BYTES / 1024);
self
}
}
pub(crate) fn open_with_options(path: &Path, options: JournalOptions) -> Result<JournalHandle> {
JournalHandle::open_with_options(path, options)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_buffered_64k() {
let o = JournalOptions::default();
assert!(!o.direct);
assert_eq!(o.log_buffer_kib, DEFAULT_LOG_BUFFER_KIB);
}
#[test]
fn direct_toggle_round_trips() {
let o = JournalOptions::new().direct(true);
assert!(o.direct);
let o = o.direct(false);
assert!(!o.direct);
}
#[test]
fn log_buffer_kib_is_clamped() {
let o = JournalOptions::new().log_buffer_kib(0);
assert_eq!(o.log_buffer_kib, MIN_LOG_BUFFER_BYTES / 1024);
let o = JournalOptions::new().log_buffer_kib(u32::MAX);
assert_eq!(o.log_buffer_kib, MAX_LOG_BUFFER_BYTES / 1024);
let o = JournalOptions::new().log_buffer_kib(256);
assert_eq!(o.log_buffer_kib, 256);
}
}