From 8278531c9851bc31e6f81a30a907297c79d532d9 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Tue, 30 Apr 2019 14:07:43 +0200 Subject: Add top level error printing --- src/main.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1ee2b94..13b42a0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,6 +28,7 @@ use std::io::Cursor; use failure::err_msg; use failure::Error; +use failure::ResultExt; use failure::Fallible as Result; use clap::ArgMatches; use filters::filter::Filter; @@ -91,7 +92,7 @@ fn deserialize_package_list(s: String, filepath: &str) -> Result Result<()> { +fn app() -> Result<()> { let app = cli::build_cli().get_matches(); initialize_logging(&app)?; let config : Configuration = { @@ -110,7 +111,9 @@ fn main() -> Result<()> { let buffer = std::fs::read_to_string(path).map_err(Error::from)?; trace!("Config read into memory"); - toml::de::from_str(&buffer).map_err(Error::from) + toml::de::from_str(&buffer) + .map_err(Error::from) + .context("Configuration file parsing") }?; trace!("Config deserialized"); @@ -210,3 +213,14 @@ fn main() -> Result<()> { Ok(()) } + +fn print_error(e: Error) { + error!("Error: {}", e); + e.iter_causes().for_each(|cause| { + error!("Caused by: {}", cause) + }); +} + +fn main() { + let _ = app().map_err(print_error); +} -- cgit v1.2.3 From 792e9e695353c94e16f199c2d846e53a178e2e4e Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Tue, 30 Apr 2019 14:22:14 +0200 Subject: Simplify error handling --- Cargo.toml | 1 + src/main.rs | 32 +++++++++++++++++--------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 474a983..a6db2ea 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ log = "0.4" flexi_logger = "0.11" prettytable-rs = "0.8" filters = "0.3" +boolinator = "2" [dependencies.clap] version = ">=2.33" diff --git a/src/main.rs b/src/main.rs index 13b42a0..04c165c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ extern crate url; extern crate xdg; extern crate flexi_logger; extern crate filters; +extern crate boolinator; #[cfg(feature = "compare_csv")] extern crate csv; @@ -32,6 +33,7 @@ use failure::ResultExt; use failure::Fallible as Result; use clap::ArgMatches; use filters::filter::Filter; +use boolinator::Boolinator; use config::Configuration; use compare::ComparePackage; @@ -193,21 +195,21 @@ fn app() -> Result<()> { }, (other, _mtch) => { - if app.is_present("input_stdin") { - // Ugly, but works: - // If we have "--stdin" on CLI, we have a CLI/Stdin backend, which means that we can query - // _any_ "project", and get the stdin anyways. This is really not like it should be, but - // works for now - let packages = backend - .project("")? - .into_iter() - .filter(|package| repository_filter.filter(package.repo())) - .collect(); - frontend.list_packages(packages)?; - } else { - error!("Unknown command: '{}'", other); - ::std::process::exit(1) - } + app.is_present("input_stdin") + .as_result((), Error::from(format_err!("Input not from stdin"))) + .and_then(|_| { + // Ugly, but works: + // If we have "--stdin" on CLI, we have a CLI/Stdin backend, which means that we can query + // _any_ "project", and get the stdin anyways. This is really not like it should be, but + // works for now + let packages = backend + .project("")? + .into_iter() + .filter(|package| repository_filter.filter(package.repo())) + .collect(); + frontend.list_packages(packages) + }) + .map_err(|_| format_err!("Unknown command: {}", other)) } } -- cgit v1.2.3 From 6ee6bdc28da2538a0c4b0d297938a7941540c2bb Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Tue, 30 Apr 2019 14:22:34 +0200 Subject: Simplify code --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 04c165c..1f34d2c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -186,7 +186,7 @@ fn app() -> Result<()> { frontend.list_problems(problems)?; }, ("compare", Some(mtch)) => { - let repos = mtch.values_of("compare-distros").unwrap().map(|s| Repo::new(String::from(s))).collect(); + let repos = mtch.values_of("compare-distros").unwrap().map(String::from).map(Repo::new).collect(); let file_path = mtch.value_of("compare-list").unwrap(); // safe by clap let content = ::std::fs::read_to_string(file_path).map_err(Error::from)?; let pkgs : Vec = deserialize_package_list(content, file_path)?; -- cgit v1.2.3 From 01661264a04215af9a5370c26213e79c0fdd56a3 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Tue, 30 Apr 2019 14:23:33 +0200 Subject: Remove unnecessary boilerplate --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 1f34d2c..f225728 100644 --- a/src/main.rs +++ b/src/main.rs @@ -188,7 +188,7 @@ fn app() -> Result<()> { ("compare", Some(mtch)) => { let repos = mtch.values_of("compare-distros").unwrap().map(String::from).map(Repo::new).collect(); let file_path = mtch.value_of("compare-list").unwrap(); // safe by clap - let content = ::std::fs::read_to_string(file_path).map_err(Error::from)?; + let content = ::std::fs::read_to_string(file_path)?; let pkgs : Vec = deserialize_package_list(content, file_path)?; frontend.compare_packages(pkgs, &backend, repos)?; -- cgit v1.2.3 From 17a57a38aec2a8e8d9649b788be54ca0e85098cd Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Tue, 30 Apr 2019 14:28:52 +0200 Subject: Return error at end of function --- src/main.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index f225728..82236a8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -165,7 +165,7 @@ fn app() -> Result<()> { .into_iter() .filter(|package| repository_filter.filter(package.repo())) .collect(); - frontend.list_packages(packages)?; + frontend.list_packages(packages) }, ("problems", Some(mtch)) => { trace!("Handling problems"); @@ -183,7 +183,7 @@ fn app() -> Result<()> { .filter(|problem| repository_filter.filter(problem.repo())) .collect(); - frontend.list_problems(problems)?; + frontend.list_problems(problems) }, ("compare", Some(mtch)) => { let repos = mtch.values_of("compare-distros").unwrap().map(String::from).map(Repo::new).collect(); @@ -191,7 +191,7 @@ fn app() -> Result<()> { let content = ::std::fs::read_to_string(file_path)?; let pkgs : Vec = deserialize_package_list(content, file_path)?; - frontend.compare_packages(pkgs, &backend, repos)?; + frontend.compare_packages(pkgs, &backend, repos) }, (other, _mtch) => { @@ -207,13 +207,12 @@ fn app() -> Result<()> { .into_iter() .filter(|package| repository_filter.filter(package.repo())) .collect(); + frontend.list_packages(packages) }) .map_err(|_| format_err!("Unknown command: {}", other)) } } - - Ok(()) } fn print_error(e: Error) { -- cgit v1.2.3