diff --git a/src/lib.rs b/src/lib.rs index d5ba8f8..dd55662 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,5 +15,6 @@ pub use crate::config::Config; pub use crate::core::Pacdef; pub use crate::grouping::Group; pub(crate) use crate::grouping::Package; +pub use crate::search::NO_PACKAGES_FOUND; extern crate pacdef_macro; diff --git a/src/main.rs b/src/main.rs index 89624df..92b6808 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,34 @@ +use std::process::{ExitCode, Termination}; + use anyhow::{Context, Result}; use pacdef::{args, Config, Group, Pacdef}; -fn main() -> Result<()> { +fn main() -> ExitCode { + handle_final_result(main_inner()) +} + +/// Skip printing the error chain when searching packages yields no results, otherwise report error +/// chain. +fn handle_final_result(result: Result<()>) -> ExitCode { + match result { + Ok(_) => ExitCode::SUCCESS, + Err(ref e) => { + let msg = e.root_cause().to_string(); + + if msg == pacdef::NO_PACKAGES_FOUND { + ExitCode::FAILURE + } else { + result.report() + } + } + } +} + +fn main_inner() -> Result<()> { let args = args::get(); let config = Config::load().context("loading config file")?; - let groups = Group::load(&config).context("loading groups")?; + let groups = Group::load(&config).context("loading groups").unwrap(); let pacdef = Pacdef::new(args, config, groups); pacdef.run_action_from_arg().context("running action") } diff --git a/src/search.rs b/src/search.rs index 88efa5c..960d4c3 100644 --- a/src/search.rs +++ b/src/search.rs @@ -8,7 +8,8 @@ use regex::Regex; use crate::grouping::{Group, Package, Section}; -// TODO don't show an error message when search yields no results +pub const NO_PACKAGES_FOUND: &str = "no packages matching query"; + pub(crate) fn search_packages(args: &ArgMatches, groups: &HashSet) -> Result<()> { let search_string = args .get_one::("string") @@ -29,7 +30,7 @@ pub(crate) fn search_packages(args: &ArgMatches, groups: &HashSet) -> Res } if vec.is_empty() { - bail!("no packages matching query") + bail!(NO_PACKAGES_FOUND) } print_triples(vec);