Merge pull request #395 from matthiasbeyer/libimagstore/store-id-iterator-generic

Libimagstore/store id iterator generic
This commit is contained in:
Matthias Beyer 2016-05-13 14:42:22 +02:00
commit 0c89fafe20
2 changed files with 54 additions and 6 deletions

View file

@ -35,6 +35,8 @@ use hook::accessor::{ MutableHookDataAccessor,
use hook::position::HookPosition;
use hook::Hook;
use self::glob_store_iter::*;
/// The Result Type returned by any interaction with the store that could fail
pub type Result<T> = RResult<T, StoreError>;
@ -361,7 +363,7 @@ impl Store {
let path = [ path, "/*" ].join("");
debug!("glob()ing with '{}'", path);
glob(&path[..])
.map(StoreIdIterator::new)
.map(|paths| StoreIdIterator::new(Box::new(GlobStoreIdIterator::new(paths))))
.map_err(|e| StoreError::new(StoreErrorKind::GlobError, Some(Box::new(e))))
} else {
Err(StoreError::new(StoreErrorKind::EncodingError, None))
@ -1253,6 +1255,53 @@ impl Entry {
}
mod glob_store_iter {
use std::fmt::{Debug, Formatter};
use std::fmt::Error as FmtError;
use glob::Paths;
use storeid::StoreId;
pub struct GlobStoreIdIterator {
paths: Paths,
}
impl Debug for GlobStoreIdIterator {
fn fmt(&self, fmt: &mut Formatter) -> Result<(), FmtError> {
write!(fmt, "GlobStoreIdIterator")
}
}
impl GlobStoreIdIterator {
pub fn new(paths: Paths) -> GlobStoreIdIterator {
GlobStoreIdIterator {
paths: paths,
}
}
}
impl Iterator for GlobStoreIdIterator {
type Item = StoreId;
fn next(&mut self) -> Option<StoreId> {
self.paths.next().and_then(|o| {
match o {
Ok(o) => Some(o),
Err(e) => {
debug!("GlobStoreIdIterator error: {:?}", e);
None
},
}
}).map(|p| StoreId::from(p))
}
}
}
#[cfg(test)]
mod test {

View file

@ -3,7 +3,6 @@ use std::path::Path;
use std::borrow::Borrow;
use std::ops::Deref;
use glob::Paths;
use semver::Version;
use std::fmt::{Debug, Formatter};
use std::fmt::Error as FmtError;
@ -156,7 +155,7 @@ macro_rules! module_entry_path_mod {
}
pub struct StoreIdIterator {
paths: Paths,
iter: Box<Iterator<Item = StoreId>>,
}
impl Debug for StoreIdIterator {
@ -169,9 +168,9 @@ impl Debug for StoreIdIterator {
impl StoreIdIterator {
pub fn new(paths: Paths) -> StoreIdIterator {
pub fn new(iter: Box<Iterator<Item = StoreId>>) -> StoreIdIterator {
StoreIdIterator {
paths: paths,
iter: iter,
}
}
@ -181,7 +180,7 @@ impl Iterator for StoreIdIterator {
type Item = StoreId;
fn next(&mut self) -> Option<StoreId> {
self.paths.next().and_then(|o| o.ok()).map(|p| StoreId::from(p))
self.iter.next()
}
}