From f604574713038d3ba2edc22b396e6fd718e0dfc6 Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 31 Oct 2016 15:28:28 +0100 Subject: [PATCH] make import::open_blk_dir prettier --- import/src/blk.rs | 39 +++++++++++---------------------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/import/src/blk.rs b/import/src/blk.rs index 6bc2e53f..b78fac7d 100644 --- a/import/src/blk.rs +++ b/import/src/blk.rs @@ -1,7 +1,7 @@ use std::{io, fs, path}; use ser::{ReadIterator, deserialize_iterator, Error as ReaderError}; use block::Block; -use fs::{read_blk_dir, ReadBlkDir}; +use fs::read_blk_dir; pub fn open_blk_file

(path: P) -> Result where P: AsRef { let file = try!(fs::File::open(path)); @@ -24,45 +24,28 @@ impl Iterator for BlkFile { } pub fn open_blk_dir

(path: P) -> Result where P: AsRef { - let dir_iter = try!(read_blk_dir(path)); + let iter = try!(read_blk_dir(path)) + // flatten results... + .flat_map(|entry| entry.and_then(|file| open_blk_file(file.path))) + // flat iterators over each block in each file + .flat_map(|file| file); + let blk_dir = BlkDir { - dir_iter: dir_iter, - current_file: None, + iter: Box::new(iter), }; + Ok(blk_dir) } pub struct BlkDir { - dir_iter: ReadBlkDir, - current_file: Option, + iter: Box>>, } impl Iterator for BlkDir { type Item = Result; fn next(&mut self) -> Option { - // TODO: use chained iterators instead - let next_file = match self.current_file { - Some(ref mut file) => match file.next() { - Some(block) => return Some(block), - None => self.dir_iter.next(), - }, - None => self.dir_iter.next(), - }; - - match next_file { - Some(Ok(next_file)) => { - self.current_file = match open_blk_file(next_file.path) { - Err(_) => return Some(Err(ReaderError::MalformedData)), - Ok(file) => Some(file), - }; - self.next() - }, - Some(Err(_)) => { - Some(Err(ReaderError::MalformedData)) - }, - None => None, - } + self.iter.next() } }