diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2019-10-19 08:54:57 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2019-10-26 18:15:20 +0200 |
commit | 58e303116d102162dfa61d6bbca6c4a0b00768cf (patch) | |
tree | 75cdb25aa7ada2c12040211a30817d24ab82c765 | |
parent | e67f5374bef4ec692cb2048ecb83276db0ba1926 (diff) |
Remove calls to exit() and replace them with error propagation up to main()
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | bin/core/imag-store/Cargo.toml | 1 | ||||
-rw-r--r-- | bin/core/imag-store/src/create.rs | 31 | ||||
-rw-r--r-- | bin/core/imag-store/src/delete.rs | 17 | ||||
-rw-r--r-- | bin/core/imag-store/src/get.rs | 20 | ||||
-rw-r--r-- | bin/core/imag-store/src/lib.rs | 27 | ||||
-rw-r--r-- | bin/core/imag-store/src/retrieve.rs | 48 | ||||
-rw-r--r-- | bin/core/imag-store/src/update.rs | 17 | ||||
-rw-r--r-- | bin/core/imag-store/src/verify.rs | 31 |
8 files changed, 86 insertions, 106 deletions
diff --git a/bin/core/imag-store/Cargo.toml b/bin/core/imag-store/Cargo.toml index a964363c..0624069d 100644 --- a/bin/core/imag-store/Cargo.toml +++ b/bin/core/imag-store/Cargo.toml @@ -23,6 +23,7 @@ maintenance = { status = "actively-developed" } log = "0.4.6" toml = "0.5.1" failure = "0.1.5" +resiter = "0.3.0" libimagstore = { version = "0.10.0", path = "../../../lib/core/libimagstore", features = ["verify"] } libimagrt = { version = "0.10.0", path = "../../../lib/core/libimagrt" } diff --git a/bin/core/imag-store/src/create.rs b/bin/core/imag-store/src/create.rs index c4a8ad14..a8989a28 100644 --- a/bin/core/imag-store/src/create.rs +++ b/bin/core/imag-store/src/create.rs @@ -17,34 +17,32 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // +use std::ops::DerefMut; use std::path::PathBuf; use std::io::stdin; use std::fs::OpenOptions; use std::io::Read; -use std::ops::DerefMut; use clap::ArgMatches; use toml::Value; use failure::Fallible as Result; +use failure::Error; use failure::err_msg; use libimagrt::runtime::Runtime; use libimagstore::store::Entry; use libimagstore::storeid::StoreId; -use libimagerror::trace::MapErrTrace; -use libimagerror::exit::ExitUnwrap; -use libimagutil::debug_result::*; use crate::util::build_toml_header; -pub fn create(rt: &Runtime) { +pub fn create(rt: &Runtime) -> Result<()> { let scmd = rt.cli().subcommand_matches("create").unwrap(); debug!("Found 'create' subcommand..."); // unwrap is safe as value is required let path = scmd.value_of("path").unwrap(); let path = PathBuf::from(path); - let path = StoreId::new(path).map_err_trace_exit_unwrap(); + let path = StoreId::new(path)?; debug!("path = {:?}", path); @@ -55,15 +53,13 @@ pub fn create(rt: &Runtime) { .or_else(|_| create_with_content_and_header(rt, &path, String::new(), - Entry::default_header())) + Entry::default_header()))?; } else { debug!("Creating entry"); - create_with_content_and_header(rt, &path, String::new(), - Entry::default_header()) + create_with_content_and_header(rt, &path, String::new(), Entry::default_header())?; } - .map_err_trace_exit_unwrap(); - rt.report_touched(&path).unwrap_or_exit(); + rt.report_touched(&path).map_err(Error::from) } fn create_from_cli_spec(rt: &Runtime, matches: &ArgMatches, path: &StoreId) -> Result<()> { @@ -99,19 +95,13 @@ fn create_from_source(rt: &Runtime, matches: &ArgMatches, path: &StoreId) -> Res debug!("Content with len = {}", content.len()); Entry::from_str(path.clone(), &content[..]) - .map_dbg_err(|e| format!("Error building entry: {:?}", e)) .and_then(|new_e| { - let r = rt.store() + rt.store() .create(path.clone()) - .map_dbg_err(|e| format!("Error in Store::create(): {:?}", e)) .map(|mut old_e| { *old_e.deref_mut() = new_e; - }); - - debug!("Entry build"); - r + }) }) - .map_dbg_err(|e| format!("Error storing entry: {:?}", e)) } fn create_with_content_and_header(rt: &Runtime, @@ -122,7 +112,6 @@ fn create_with_content_and_header(rt: &Runtime, debug!("Creating entry with content at {:?}", path); rt.store() .create(path.clone()) - .map_dbg_err(|e| format!("Error in Store::create(): {:?}", e)) .map(|mut element| { { let e_content = element.get_content_mut(); @@ -177,7 +166,7 @@ mod tests { let test_name = "test_create_simple"; let rt = generate_test_runtime(vec!["create", "test_create_simple"]).unwrap(); - create(&rt); + create(&rt).unwrap(); let e = rt.store().get(PathBuf::from(test_name)); assert!(e.is_ok()); diff --git a/bin/core/imag-store/src/delete.rs b/bin/core/imag-store/src/delete.rs index e361d535..226e08a0 100644 --- a/bin/core/imag-store/src/delete.rs +++ b/bin/core/imag-store/src/delete.rs @@ -19,22 +19,19 @@ use std::path::PathBuf; +use failure::Fallible as Result; + use libimagrt::runtime::Runtime; -use libimagerror::trace::MapErrTrace; use libimagstore::storeid::StoreId; -use libimagutil::warn_result::*; -pub fn delete(rt: &Runtime) { +pub fn delete(rt: &Runtime) -> Result<()> { let scmd = rt.cli().subcommand_matches("delete").unwrap(); let id = scmd.value_of("id").unwrap(); // safe by clap let path = PathBuf::from(id); - let path = StoreId::new(path).map_err_trace_exit_unwrap(); + let path = StoreId::new(path)?; debug!("Deleting file at {:?}", id); - rt.store() - .delete(path) - .map_warn_err(|e| format!("Error: {:?}", e)) - .map_err_trace_exit_unwrap(); + rt.store().delete(path) } #[cfg(test)] @@ -59,11 +56,11 @@ mod tests { let test_name = "test_create_simple"; let rt = generate_test_runtime(vec!["create", "test_create_simple"]).unwrap(); - create(&rt); + create(&rt).unwrap(); let rt = reset_test_runtime(vec!["delete", "test_create_simple"], rt).unwrap(); - delete(&rt); + delete(&rt).unwrap(); let e = rt.store().get(PathBuf::from(test_name)); assert!(e.is_ok()); diff --git a/bin/core/imag-store/src/get.rs b/bin/core/imag-store/src/get.rs index 21115398..b47fabc3 100644 --- a/bin/core/imag-store/src/get.rs +++ b/bin/core/imag-store/src/get.rs @@ -19,27 +19,29 @@ use std::path::PathBuf; +use failure::Fallible as Result; +use failure::Error; +use failure::err_msg; + use libimagrt::runtime::Runtime; -use libimagerror::trace::MapErrTrace; -use libimagerror::exit::ExitUnwrap; use libimagstore::storeid::StoreId; use crate::retrieve::print_entry; -pub fn get(rt: &Runtime) { +pub fn get(rt: &Runtime) -> Result<()> { let scmd = rt.cli().subcommand_matches("get").unwrap(); let id = scmd.value_of("id").unwrap(); // safe by clap let path = PathBuf::from(id); - let path = StoreId::new(path).map_err_trace_exit_unwrap(); + let path = StoreId::new(path)?; debug!("path = {:?}", path); - match rt.store().get(path.clone()).map_err_trace_exit_unwrap() { + match rt.store().get(path.clone())? { + None => Err(err_msg("No entry found")), Some(entry) => { - print_entry(rt, scmd, entry); - rt.report_touched(&path).unwrap_or_exit(); + print_entry(rt, scmd, entry)?; + rt.report_touched(&path).map_err(Error::from) }, - None => info!("No entry found"), - }; + } } diff --git a/bin/core/imag-store/src/lib.rs b/bin/core/imag-store/src/lib.rs index 1936ecef..53e023ed 100644 --- a/bin/core/imag-store/src/lib.rs +++ b/bin/core/imag-store/src/lib.rs @@ -37,8 +37,9 @@ extern crate clap; #[macro_use] extern crate log; extern crate toml; +extern crate resiter; #[cfg(test)] extern crate toml_query; -extern crate failure; +#[macro_use] extern crate failure; extern crate libimagrt; extern crate libimagstore; @@ -53,7 +54,9 @@ extern crate libimagutil; use libimagrt::application::ImagApplication; use libimagrt::runtime::Runtime; -use libimagerror::trace::MapErrTrace; + +use failure::Fallible as Result; +use failure::err_msg; mod create; mod delete; @@ -66,7 +69,6 @@ mod util; use std::ops::Deref; -use failure::Fallible as Result; use clap::App; use crate::create::create; @@ -83,9 +85,7 @@ use crate::verify::verify; pub enum ImagStore {} impl ImagApplication for ImagStore { fn run(rt: Runtime) -> Result<()> { - let command = rt.cli().subcommand_name().map(String::from); - - if let Some(command) = command { + if let Some(command) = rt.cli().subcommand_name() { debug!("Call: {}", command); match command.deref() { "create" => create(&rt), @@ -96,17 +96,16 @@ impl ImagApplication for ImagStore { "verify" => verify(&rt), other => { debug!("Unknown command"); - let _ = rt.handle_unknown_subcommand("imag-store", other, rt.cli()) - .map_err_trace_exit_unwrap() - .code() - .map(::std::process::exit); + if rt.handle_unknown_subcommand("imag-store", other, rt.cli())?.success() { + Ok(()) + } else { + Err(format_err!("Subcommand failed")) + } }, - }; + } } else { - debug!("No command"); + Err(err_msg("No command")) } - - Ok(()) } fn build_cli<'a>(app: App<'a, 'a>) -> App<'a, 'a> { diff --git a/bin/core/imag-store/src/retrieve.rs b/bin/core/imag-store/src/retrieve.rs index a84d39d7..7ae516d7 100644 --- a/bin/core/imag-store/src/retrieve.rs +++ b/bin/core/imag-store/src/retrieve.rs @@ -20,41 +20,32 @@ use std::path::PathBuf; use std::io::Write; +use failure::Fallible as Result; +use failure::Error; use clap::ArgMatches; use libimagstore::store::FileLockEntry; use libimagstore::storeid::StoreId; use libimagrt::runtime::Runtime; -use libimagerror::trace::MapErrTrace; -use libimagerror::io::ToExitCode; -use libimagerror::exit::ExitUnwrap; -use libimagutil::debug_result::*; -pub fn retrieve(rt: &Runtime) { - if let Some(scmd) = rt.cli().subcommand_matches("retrieve") { - // unwrap() is safe as arg is required - let id = scmd.value_of("id").unwrap(); - let path = PathBuf::from(id); - let path = StoreId::new(path).map_err_trace_exit_unwrap(); - debug!("path = {:?}", path); +pub fn retrieve(rt: &Runtime) -> Result<()> { + let scmd = rt.cli().subcommand_matches("retrieve").unwrap(); + let id = scmd.value_of("id").unwrap(); + let path = PathBuf::from(id); + let path = StoreId::new(path)?; + debug!("path = {:?}", path); - rt.store() - .retrieve(path.clone()) - .map(|e| print_entry(rt, scmd, e)) - .map_dbg_str("No entry") - .map_dbg(|e| format!("{:?}", e)) - .map_err_trace_exit_unwrap(); + rt.store() + .retrieve(path.clone()) + .and_then(|e| print_entry(rt, scmd, e))?; - rt.report_touched(&path).unwrap_or_exit(); - } + rt.report_touched(&path).map_err(Error::from) } -pub fn print_entry(rt: &Runtime, scmd: &ArgMatches, e: FileLockEntry) { +pub fn print_entry(rt: &Runtime, scmd: &ArgMatches, e: FileLockEntry) -> Result<()> { if do_print_raw(scmd) { debug!("Printing raw content..."); - writeln!(rt.stdout(), "{}", e.to_str().map_err_trace_exit_unwrap()) - .to_exit_code() - .unwrap_or_exit(); + writeln!(rt.stdout(), "{}", e.to_str()?)?; } else if do_filter(scmd) { debug!("Filtering..."); warn!("Filtering via header specs is currently now supported."); @@ -71,20 +62,17 @@ pub fn print_entry(rt: &Runtime, scmd: &ArgMatches, e: FileLockEntry) { unimplemented!() } else { debug!("Printing header as TOML..."); - writeln!(rt.stdout(), "{}", e.get_header()) - .to_exit_code() - .unwrap_or_exit(); + writeln!(rt.stdout(), "{}", e.get_header())?; } } if do_print_content(scmd) { debug!("Printing content..."); - writeln!(rt.stdout(), "{}", e.get_content()) - .to_exit_code() - .unwrap_or_exit(); + writeln!(rt.stdout(), "{}", e.get_content())?; } - } + + Ok(()) } fn do_print_header(m: &ArgMatches) -> bool { diff --git a/bin/core/imag-store/src/update.rs b/bin/core/imag-store/src/update.rs index fad5b3f7..8f2479fd 100644 --- a/bin/core/imag-store/src/update.rs +++ b/bin/core/imag-store/src/update.rs @@ -20,22 +20,23 @@ use std::ops::DerefMut; use std::path::PathBuf; +use failure::Fallible as Result; +use failure::Error; + use libimagrt::runtime::Runtime; -use libimagerror::trace::MapErrTrace; -use libimagerror::exit::ExitUnwrap; use libimagstore::storeid::StoreId; use crate::util::build_toml_header; -pub fn update(rt: &Runtime) { +pub fn update(rt: &Runtime) -> Result<()> { let scmd = rt.cli().subcommand_matches("update").unwrap(); let id = scmd.value_of("id").unwrap(); // Safe by clap let path = PathBuf::from(id); - let path = StoreId::new(path).map_err_trace_exit_unwrap(); + let path = StoreId::new(path)?; - let _ = rt.store() + rt.store() .retrieve(path) - .map(|mut locked_e| { + .and_then(|mut locked_e| { { let e = locked_e.deref_mut(); @@ -48,7 +49,7 @@ pub fn update(rt: &Runtime) { debug!("New header set"); } - rt.report_touched(locked_e.get_location()).unwrap_or_exit(); - }); + rt.report_touched(locked_e.get_location()).map_err(Error::from) + }) } diff --git a/bin/core/imag-store/src/verify.rs b/bin/core/imag-store/src/verify.rs index a43ad908..bf4c19d7 100644 --- a/bin/core/imag-store/src/verify.rs +++ b/bin/core/imag-store/src/verify.rs @@ -19,26 +19,25 @@ use std::ops::Deref; +use failure::Fallible as Result; +use failure::err_msg; +use resiter::AndThen; + use libimagrt::runtime::Runtime; -use libimagutil::warn_exit::warn_exit; -use libimagerror::trace::MapErrTrace; -use libimagerror::exit::ExitUnwrap; -use libimagerror::iter::TraceIterator; +use libimagerror::iter::IterInnerOkOrElse; /// Verify the store. /// /// This function is not intended to be called by normal programs but only by `imag-store`. -pub fn verify(rt: &Runtime) { +pub fn verify(rt: &Runtime) -> Result<()> { info!("Header | Content length | Path"); info!("-------+----------------+-----"); let result = rt .store() - .entries() - .map_err_trace_exit_unwrap() + .entries()? .into_get_iter() - .trace_unwrap_exit() - .filter_map(|x| x) - .all(|fle| { + .map_inner_ok_or_else(|| err_msg("Did not find one entry")) + .and_then_ok(|fle| { let p = fle.get_location(); let content_len = fle.get_content().len(); let (verify, status) = if fle.verify().is_ok() { @@ -48,14 +47,18 @@ pub fn verify(rt: &Runtime) { }; info!("{: >6} | {: >14} | {:?}", verify, content_len, p.deref()); - rt.report_touched(fle.get_location()).unwrap_or_exit(); - status - }); + rt.report_touched(fle.get_location())?; + Ok(status) + }) + .collect::<Result<Vec<_>>>()? + .iter() + .all(|x| *x); if result { info!("Store seems to be fine"); + Ok(()) } else { - warn_exit("Store seems to be broken somehow", 1); + Err(err_msg("Store seems to be broken somehow")) } } |