use crate::error::Error;
use crate::iter::DirEntries;
use crate::types::RequestedAttributes;
use std::path::{Path, PathBuf};
pub struct DirReader {
path: PathBuf,
attrs: RequestedAttributes,
buffer_size: usize,
follow_symlinks: bool,
}
impl DirReader {
pub fn new<P: AsRef<Path>>(path: P) -> Self {
Self {
path: path.as_ref().to_owned(),
attrs: RequestedAttributes::default(),
buffer_size: 64 * 1024,
follow_symlinks: true,
}
}
pub fn name(mut self) -> Self {
self.attrs.name = true;
self
}
pub fn object_type(mut self) -> Self {
self.attrs.object_type = true;
self
}
pub fn size(mut self) -> Self {
self.attrs.size = true;
self
}
pub fn alloc_size(mut self) -> Self {
self.attrs.alloc_size = true;
self
}
pub fn modified_time(mut self) -> Self {
self.attrs.modified_time = true;
self
}
pub fn permissions(mut self) -> Self {
self.attrs.permissions = true;
self
}
pub fn inode(mut self) -> Self {
self.attrs.inode = true;
self
}
pub fn entry_count(mut self) -> Self {
self.attrs.entry_count = true;
self
}
pub fn all_attributes(mut self) -> Self {
self.attrs = RequestedAttributes::all();
self
}
pub fn buffer_size(mut self, size: usize) -> Self {
self.buffer_size = size;
self
}
pub fn attributes(mut self, attrs: RequestedAttributes) -> Self {
self.attrs = attrs;
self
}
pub fn follow_symlinks(mut self, follow: bool) -> Self {
self.follow_symlinks = follow;
self
}
pub fn read(self) -> Result<DirEntries, Error> {
let mut attrs = self.attrs;
if !attrs.name {
attrs.name = true;
}
DirEntries::new(&self.path, attrs, self.buffer_size, self.follow_symlinks)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_builder_chaining() {
let reader = DirReader::new("/tmp")
.name()
.size()
.object_type()
.buffer_size(128 * 1024);
assert!(reader.attrs.name);
assert!(reader.attrs.size);
assert!(reader.attrs.object_type);
assert!(!reader.attrs.permissions);
assert_eq!(reader.buffer_size, 128 * 1024);
}
#[test]
fn test_all_attributes() {
let reader = DirReader::new("/tmp").all_attributes();
assert!(reader.attrs.name);
assert!(reader.attrs.size);
assert!(reader.attrs.object_type);
assert!(reader.attrs.permissions);
assert!(reader.attrs.inode);
}
}