diff options
author | Sebastian Thiel <sthiel@thoughtworks.com> | 2019-06-01 11:08:15 +0530 |
---|---|---|
committer | Sebastian Thiel <sthiel@thoughtworks.com> | 2019-06-01 11:08:15 +0530 |
commit | 638be3c8e7362b809c2c6558d630aa355349b1e8 (patch) | |
tree | fd93b8e24ece00582f25c48ca8b209d6306f40ab /src/lib.rs | |
parent | 449f964850feb89d8a179bbc8a45cea6580577eb (diff) |
First basic implementation of aggregation; symlinks are not handled yet
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 67 |
1 files changed, 64 insertions, 3 deletions
@@ -1,8 +1,69 @@ extern crate failure; extern crate jwalk; -use failure::Error; +pub struct WalkOptions { + pub threads: usize, +} + +impl WalkOptions { + pub fn iter_from_path(&self, path: &Path) -> WalkDir { + WalkDir::new(path) + .preload_metadata(true) + .skip_hidden(false) + .num_threads(self.threads) + } +} + +#[derive(Default)] +pub struct WalkResult { + pub num_errors: usize, +} -pub fn fun() -> Result<(), Error> { - unimplemented!(); +impl fmt::Display for WalkResult { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + write!(f, "Encountered {} IO errors", self.num_errors) + } } + +mod aggregate { + use crate::{WalkOptions, WalkResult}; + use failure::Error; + use std::io; + use std::path::Path; + + pub fn aggregate( + mut out: impl io::Write, + options: WalkOptions, + paths: impl IntoIterator<Item = impl AsRef<Path>>, + ) -> Result<WalkResult, Error> { + let mut res = WalkResult::default(); + for path in paths.into_iter() { + let mut num_bytes = 0u64; + for entry in options.iter_from_path(path.as_ref()) { + match entry { + Ok(entry) => { + num_bytes += match entry.metadata { + Some(Ok(m)) => m.len(), + Some(Err(_)) => { + res.num_errors += 1; + 0 + } + None => unreachable!( + "we ask for metadata, so we at least have Some(Err(..)))" + ), + }; + } + Err(_) => res.num_errors += 1, + } + } + + writeln!(out, "{}\t{}", num_bytes, path.as_ref().display())?; + } + Ok(res) + } +} + +pub use aggregate::aggregate; +use jwalk::WalkDir; +use std::fmt; +use std::path::Path; |