From 1365ee5b5cd9acd2d9c52044387b210d943c867e Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Tue, 10 Jan 2023 18:00:02 +0100 Subject: [PATCH] improve error handling --- src/backend/rust.rs | 9 +++++---- src/core.rs | 23 +++++++++++++++++++---- src/env.rs | 4 ++++ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/backend/rust.rs b/src/backend/rust.rs index 5665256..ef00356 100644 --- a/src/backend/rust.rs +++ b/src/backend/rust.rs @@ -21,14 +21,15 @@ impl Backend for Rust { impl_backend_constants!(); fn get_all_installed_packages(&self) -> Result> { - let file = get_crates_file().unwrap(); - let content = read_to_string(file).unwrap(); - let json: Value = serde_json::from_str(&content).unwrap(); - extract_packages(json) + let file = get_crates_file().context("getting path to crates file")?; + let content = read_to_string(file).context("reading crates file")?; + let json: Value = serde_json::from_str(&content).context("parsing JSON")?; + extract_packages(json).context("extracing packages from JSON") } fn get_explicitly_installed_packages(&self) -> Result> { self.get_all_installed_packages() + .context("getting all installed packages") } } diff --git a/src/core.rs b/src/core.rs index 73e092f..a665128 100644 --- a/src/core.rs +++ b/src/core.rs @@ -4,8 +4,9 @@ use anyhow::{ensure, Context, Result}; use clap::ArgMatches; use crate::action; -use crate::backend::{Backends, ToDoPerBackend}; +use crate::backend::{Backend, Backends, ToDoPerBackend}; use crate::cmd::run_edit_command; +use crate::env::get_single_var; use crate::ui::get_user_confirmation; use crate::Group; @@ -32,7 +33,9 @@ impl Pacdef { Some((action::UNMANAGED, _)) => Ok(self.show_unmanaged_packages()), Some((action::VERSION, _)) => Ok(self.show_version()), Some((_, _)) => todo!(), - None => unreachable!(), + None => { + unreachable!("argument parser requires some subcommand to return an `ArgMatches`") + } } } @@ -44,7 +47,7 @@ impl Pacdef { match backend.get_missing_packages_sorted() { Ok(diff) => to_install.push((backend, diff)), - Err(e) => println!("WARNING: skipping backend '{}': {e}", backend.get_section()), + Err(error) => show_error(error, backend), }; } @@ -123,7 +126,7 @@ impl Pacdef { match backend.get_unmanaged_packages_sorted() { Ok(unmanaged) => result.push((backend, unmanaged)), - Err(e) => println!("WARNING: skipping backend '{}': {e}", backend.get_section()), + Err(error) => show_error(error, backend), }; } result @@ -165,3 +168,15 @@ impl Pacdef { } } } + +fn show_error(error: anyhow::Error, backend: Box) { + let section = backend.get_section(); + match get_single_var("RUST_BACKTRACE") { + Some(s) => { + if s == "1" || s == "full" { + println!("WARNING: skipping backend '{section}': {error:?}\n"); + } + } + None => println!("WARNING: skipping backend '{section}': {error}"), + } +} diff --git a/src/env.rs b/src/env.rs index 029da38..16030b4 100644 --- a/src/env.rs +++ b/src/env.rs @@ -9,3 +9,7 @@ pub(crate) fn get_editor() -> Result { fn check_vars_in_order(vars: &[&str]) -> Option { vars.iter().flat_map(|v| var(v).ok()).next() } + +pub(crate) fn get_single_var(variable: &str) -> Option { + var(variable).ok() +}