Skip to main content

windows_erg/file/
builder.rs

1//! Builder for advanced raw file open options.
2
3use std::path::{Path, PathBuf};
4
5use crate::error::InvalidParameterError;
6use crate::{Error, Result};
7
8use super::raw::RawFile;
9
10/// Builder for opening [`RawFile`] with custom tuning parameters.
11pub struct RawFileBuilder {
12    path: Option<PathBuf>,
13    clusters_per_read: usize,
14    metadata_buffer_capacity: usize,
15}
16
17impl RawFileBuilder {
18    /// Create a new raw file builder.
19    pub fn new() -> Self {
20        Self {
21            path: None,
22            clusters_per_read: 16,
23            metadata_buffer_capacity: 32_000,
24        }
25    }
26
27    /// Set the source path.
28    pub fn path<P: AsRef<Path>>(mut self, path: P) -> Self {
29        self.path = Some(path.as_ref().to_path_buf());
30        self
31    }
32
33    /// Set how many clusters are attempted per read call.
34    ///
35    /// Minimum accepted value is 1.
36    pub fn clusters_per_read(mut self, clusters_per_read: usize) -> Self {
37        self.clusters_per_read = clusters_per_read.max(1);
38        self
39    }
40
41    /// Set the internal metadata work buffer capacity.
42    ///
43    /// Minimum accepted value is 4096 bytes.
44    pub fn metadata_buffer_capacity(mut self, metadata_buffer_capacity: usize) -> Self {
45        self.metadata_buffer_capacity = metadata_buffer_capacity.max(4096);
46        self
47    }
48
49    /// Open the configured raw file.
50    pub fn open(self) -> Result<RawFile> {
51        let path = self.path.ok_or_else(|| {
52            Error::InvalidParameter(InvalidParameterError::new(
53                "path",
54                "Raw file source path must be specified",
55            ))
56        })?;
57
58        RawFile::open_with_tuning(path, self.clusters_per_read, self.metadata_buffer_capacity)
59    }
60}
61
62impl Default for RawFileBuilder {
63    fn default() -> Self {
64        Self::new()
65    }
66}
67
68#[cfg(test)]
69mod tests {
70    use super::RawFileBuilder;
71    use crate::Error;
72
73    #[test]
74    fn open_requires_path() {
75        let result = RawFileBuilder::new().open();
76        match result {
77            Err(Error::InvalidParameter(e)) => {
78                assert_eq!(e.parameter, "path");
79            }
80            _ => panic!("expected InvalidParameter error"),
81        }
82    }
83}