From 04df3fdf3c34e92dbf7ddfc79c0d2344c602ae76 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Fri, 4 Dec 2015 14:17:32 +0100 Subject: [PATCH] Rewrite BMModule::get_filtered_files_from_backend() with the backend speaking Result<> now instead of Option<> --- src/module/bm/commands.rs | 89 +++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 41 deletions(-) diff --git a/src/module/bm/commands.rs b/src/module/bm/commands.rs index ae07c164..43200b0f 100644 --- a/src/module/bm/commands.rs +++ b/src/module/bm/commands.rs @@ -66,34 +66,35 @@ pub fn remove_command(module: &Module, env: CommandEnv) -> CommandResult { } else { debug!("Remove more than one file"); - let files = get_filtered_files_from_backend(module, &env); - let nfiles = files.len(); - info!("Removing {} Files", nfiles); + get_filtered_files_from_backend(module, &env).and_then(|files| { + let nfiles = files.len(); + info!("Removing {} Files", nfiles); - let errs = files.map(|file| { - debug!("Remove file: {:?}", file); - env.bk.remove_file(module, file, checked) - }) - .filter(|e| e.is_err()) - .map(|e| { - let err = e.err().unwrap(); - warn!("Error occured in Filesystem operation: {}", err); - err - }) - .collect::>(); + let errs = files.map(|file| { + debug!("Remove file: {:?}", file); + env.bk.remove_file(module, file, checked) + }) + .filter(|e| e.is_err()) + .map(|e| { + let err = e.err().unwrap(); + warn!("Error occured in Filesystem operation: {}", err); + err + }) + .collect::>(); - let nerrs = errs.len(); + let nerrs = errs.len(); - if nerrs != 0 { - warn!("{} Errors occured while removing {} files", nerrs, nfiles); - let moderr = ModuleError::new("File removal failed"); + if nerrs != 0 { + warn!("{} Errors occured while removing {} files", nerrs, nfiles); + let moderr = ModuleError::new("File removal failed"); - // TODO : Collect StorageBackendErrors + // TODO : Collect StorageBackendErrors - Err(moderr) - } else { - Ok(()) - } + Err(moderr) + } else { + Ok(()) + } + }) } } @@ -104,28 +105,34 @@ pub fn remove_command(module: &Module, env: CommandEnv) -> CommandResult { */ fn get_filtered_files_from_backend<'a>(module: &'a Module, - env: &CommandEnv) -> IntoIter> + env: &CommandEnv) + -> Result>, ModuleError> { let parser = Parser::new(JsonHeaderParser::new(None)); let tags = get_tags(env.rt, env.matches); debug!("Tags: {:?}", tags); - env.bk.iter_files(module, &parser).and_then(|files| { - let f = files.filter(|file| { - if tags.len() != 0 { - debug!("Checking tags of: {:?}", file.id()); - get_tags_from_header(&file.header()).iter() - .any(|t| tags.contains(t)) - } else { - true - } - }).filter(|file| { - debug!("Checking matches of: {:?}", file.id()); - get_matcher(env.rt, env.matches) - .and_then(|r| Some(file.matches_with(&r))) - .unwrap_or(true) - }).collect::>(); - Some(f) - }).unwrap_or(Vec::::new()).into_iter() + env.bk.iter_files(module, &parser) + .map(|files| { + let f = files.filter(|file| { + if tags.len() != 0 { + debug!("Checking tags of: {:?}", file.id()); + get_tags_from_header(&file.header()).iter() + .any(|t| tags.contains(t)) + } else { + true + } + }).filter(|file| { + debug!("Checking matches of: {:?}", file.id()); + get_matcher(env.rt, env.matches) + .and_then(|r| Some(file.matches_with(&r))) + .unwrap_or(true) + }).collect::>(); + f.into_iter() + }).map_err(|e| { + let mut merr = ModuleError::new("Could not filter files"); + merr.caused_by = Some(Box::new(e)); + merr + }) } fn get_tags<'a>(rt: &Runtime, sub: &ArgMatches<'a, 'a>) -> Vec {