From 3a5bb3a5ce83f29ae74986e308fdd2be871e5085 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Mon, 28 Dec 2015 15:00:02 +0100 Subject: [PATCH] Add Store::load_by_hash() --- src/storage/mod.rs | 53 ++++++++++++++-------------------------------- 1 file changed, 16 insertions(+), 37 deletions(-) diff --git a/src/storage/mod.rs b/src/storage/mod.rs index 056635f3..0719dcf9 100644 --- a/src/storage/mod.rs +++ b/src/storage/mod.rs @@ -187,48 +187,27 @@ impl Store { -> Option>> where HP: FileHeaderParser { - macro_rules! try_some { - ($expr:expr) => (match $expr { - ::std::option::Option::Some(val) => val, - ::std::option::Option::None => return ::std::option::Option::None, - }); - - ($expr:expr => return) => (match $expr { - ::std::option::Option::Some(val) => val, - ::std::option::Option::None => return, - }) - } - use glob::{glob, Paths, PatternError}; let hashstr : String = hash.into(); let globstr = format!("{}/*-{}.imag", self.storepath, hashstr); - debug!("glob({})", globstr); - let globs = glob(&globstr[..]); - if globs.is_err() { - return None; - } - - let path = globs.unwrap().last(); - debug!("path = {:?}", path); - - let pathbuf = try_some!(path); - if pathbuf.is_err() { return None; } - - let pathbuf_un = pathbuf.unwrap(); - let filename = pathbuf_un.file_name(); - let s = try_some!(filename).to_str(); - let string = String::from(try_some!(s)); - let id = try_some!(FileID::parse(&string)); - - debug!("Loaded ID = '{:?}'", id); - - self.load_in_cache(m, parser, id) - .map(|file| { - debug!("Loaded File = '{:?}'", file); - Some(file) - }).unwrap_or(None) + glob(&globstr[..]).map(|paths| { + // We assume there is only one ... TODO: Check whether there is actually just one + paths.last().map(|path| { + if let Ok(pathbuf) = path { + let fname = pathbuf.file_name().and_then(|s| s.to_str()); + fname.map(|s| { + FileID::parse(&String::from(s)).map(|id| { + self.load_in_cache(m, parser, id).map(|file| { + return Some(file) + }) + }); + }); + } + }) + }); + None } pub fn remove(&self, id: FileID) -> bool {