use std::path::Path;
use super::default_mapped_file_impl::DefaultMappedFile;
use super::FlushStrategy;
use super::MappedFileError;
use super::MappedFileResult;
#[derive(Debug, Clone)]
pub struct MappedFileBuilder {
file_path: String,
file_size: Option<u64>,
flush_strategy: FlushStrategy,
use_transient_store_pool: bool,
enable_metrics: bool,
warmup: bool,
file_from_offset: Option<u64>,
}
impl MappedFileBuilder {
pub fn new<P: AsRef<Path>>(file_path: P) -> Self {
Self {
file_path: file_path.as_ref().to_string_lossy().to_string(),
file_size: None,
flush_strategy: FlushStrategy::Async,
use_transient_store_pool: false,
enable_metrics: true,
warmup: false,
file_from_offset: None,
}
}
pub fn size(mut self, bytes: u64) -> Self {
self.file_size = Some(bytes);
self
}
pub fn size_mb(self, mb: u64) -> Self {
self.size(mb * 1024 * 1024)
}
pub fn size_gb(self, gb: u64) -> Self {
self.size(gb * 1024 * 1024 * 1024)
}
pub fn flush_strategy(mut self, strategy: FlushStrategy) -> Self {
self.flush_strategy = strategy;
self
}
pub fn enable_transient_store_pool(mut self) -> Self {
self.use_transient_store_pool = true;
self
}
pub fn disable_metrics(mut self) -> Self {
self.enable_metrics = false;
self
}
pub fn warmup(mut self, enabled: bool) -> Self {
self.warmup = enabled;
self
}
pub fn file_from_offset(mut self, offset: u64) -> Self {
self.file_from_offset = Some(offset);
self
}
fn validate(&self) -> MappedFileResult<()> {
if self.file_size.is_none() {
return Err(MappedFileError::Configuration(
"file size must be specified".to_string(),
));
}
let size = self.file_size.unwrap();
if size == 0 {
return Err(MappedFileError::Configuration(
"file size must be greater than zero".to_string(),
));
}
const MAX_FILE_SIZE: u64 = 16 * 1024 * 1024 * 1024; if size > MAX_FILE_SIZE {
return Err(MappedFileError::Configuration(format!(
"file size {} exceeds maximum {} bytes",
size, MAX_FILE_SIZE
)));
}
Ok(())
}
pub fn build(self) -> MappedFileResult<DefaultMappedFile> {
self.validate()?;
Err(MappedFileError::Configuration(
"Builder implementation pending DefaultMappedFile refactoring".to_string(),
))
}
pub fn get_file_size(&self) -> Option<u64> {
self.file_size
}
pub fn get_flush_strategy(&self) -> &FlushStrategy {
&self.flush_strategy
}
pub fn is_transient_store_pool_enabled(&self) -> bool {
self.use_transient_store_pool
}
pub fn is_metrics_enabled(&self) -> bool {
self.enable_metrics
}
pub fn is_warmup_enabled(&self) -> bool {
self.warmup
}
pub fn get_file_from_offset(&self) -> Option<u64> {
self.file_from_offset
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_builder_basic() {
let builder = MappedFileBuilder::new("test/file")
.size(1024 * 1024)
.flush_strategy(FlushStrategy::Sync);
assert_eq!(builder.get_file_size(), Some(1024 * 1024));
assert!(matches!(builder.get_flush_strategy(), FlushStrategy::Sync));
}
#[test]
fn test_builder_size_helpers() {
let builder_mb = MappedFileBuilder::new("test/file").size_mb(10);
assert_eq!(builder_mb.get_file_size(), Some(10 * 1024 * 1024));
let builder_gb = MappedFileBuilder::new("test/file").size_gb(1);
assert_eq!(builder_gb.get_file_size(), Some(1024 * 1024 * 1024));
}
#[test]
fn test_builder_options() {
let builder = MappedFileBuilder::new("test/file")
.size(1024)
.enable_transient_store_pool()
.disable_metrics()
.warmup(true)
.file_from_offset(1000);
assert!(builder.is_transient_store_pool_enabled());
assert!(!builder.is_metrics_enabled());
assert!(builder.is_warmup_enabled());
assert_eq!(builder.get_file_from_offset(), Some(1000));
}
#[test]
fn test_validation_missing_size() {
let builder = MappedFileBuilder::new("test/file");
assert!(builder.validate().is_err());
}
#[test]
fn test_validation_zero_size() {
let builder = MappedFileBuilder::new("test/file").size(0);
assert!(builder.validate().is_err());
}
#[test]
fn test_validation_too_large() {
let builder = MappedFileBuilder::new("test/file").size(20 * 1024 * 1024 * 1024);
assert!(builder.validate().is_err());
}
#[test]
fn test_validation_success() {
let builder = MappedFileBuilder::new("test/file").size(1024 * 1024);
assert!(builder.validate().is_ok());
}
}