windows_erg/file/
builder.rs1use std::path::{Path, PathBuf};
4
5use crate::error::InvalidParameterError;
6use crate::{Error, Result};
7
8use super::raw::RawFile;
9
10pub struct RawFileBuilder {
12 path: Option<PathBuf>,
13 clusters_per_read: usize,
14 metadata_buffer_capacity: usize,
15}
16
17impl RawFileBuilder {
18 pub fn new() -> Self {
20 Self {
21 path: None,
22 clusters_per_read: 16,
23 metadata_buffer_capacity: 32_000,
24 }
25 }
26
27 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 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 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 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}