summaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
authorSebastian Thiel <sthiel@thoughtworks.com>2019-06-01 11:08:15 +0530
committerSebastian Thiel <sthiel@thoughtworks.com>2019-06-01 11:08:15 +0530
commit638be3c8e7362b809c2c6558d630aa355349b1e8 (patch)
treefd93b8e24ece00582f25c48ca8b209d6306f40ab /src/lib.rs
parent449f964850feb89d8a179bbc8a45cea6580577eb (diff)
First basic implementation of aggregation; symlinks are not handled yet
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs67
1 files changed, 64 insertions, 3 deletions
diff --git a/src/lib.rs b/src/lib.rs
index fd4cb89..5d22577 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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;