stash: deduplicate error reporting

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I6a6a6964f0f3f13190dde392fc859718716b56a8
This commit is contained in:
raf 2025-08-12 16:43:43 +03:00
commit 7ebe514e3a
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF

View file

@ -75,6 +75,16 @@ enum Command {
}, },
} }
fn report_error<T>(result: Result<T, impl std::fmt::Display>, context: &str) -> Option<T> {
match result {
Ok(val) => Some(val),
Err(e) => {
log::error!("{context}: {e}");
None
}
}
}
fn main() { fn main() {
let cli = Cli::parse(); let cli = Cli::parse();
env_logger::Builder::new() env_logger::Builder::new()
@ -98,61 +108,58 @@ fn main() {
match cli.command { match cli.command {
Some(Command::Store) => { Some(Command::Store) => {
let state = env::var("STASH_CLIPBOARD_STATE").ok(); let state = env::var("STASH_CLIPBOARD_STATE").ok();
if let Err(e) = db.store(io::stdin(), cli.max_dedupe_search, cli.max_items, state) { report_error(
log::error!("Failed to store entry: {e}"); db.store(io::stdin(), cli.max_dedupe_search, cli.max_items, state),
} "Failed to store entry",
);
} }
Some(Command::List) => { Some(Command::List) => {
if let Err(e) = db.list(io::stdout(), cli.preview_width) { report_error(
log::error!("Failed to list entries: {e}"); db.list(io::stdout(), cli.preview_width),
} "Failed to list entries",
);
} }
Some(Command::Decode { input }) => { Some(Command::Decode { input }) => {
if let Err(e) = db.decode(io::stdin(), io::stdout(), input) { report_error(
log::error!("Failed to decode entry: {e}"); db.decode(io::stdin(), io::stdout(), input),
} "Failed to decode entry",
);
} }
Some(Command::Delete { arg, r#type }) => match (arg, r#type.as_deref()) { Some(Command::Delete { arg, r#type }) => match (arg, r#type.as_deref()) {
(Some(s), Some("id")) => { (Some(s), Some("id")) => {
if let Ok(id) = s.parse::<u64>() { if let Ok(id) = s.parse::<u64>() {
use std::io::Cursor; use std::io::Cursor;
if let Err(e) = db.delete(Cursor::new(format!("{id}\n"))) { report_error(
log::error!("Failed to delete entry by id: {e}"); db.delete(Cursor::new(format!("{id}\n"))),
} "Failed to delete entry by id",
);
} else { } else {
log::error!("Argument is not a valid id"); log::error!("Argument is not a valid id");
} }
} }
(Some(s), Some("query")) => { (Some(s), Some("query")) => {
if let Err(e) = db.query_delete(&s) { report_error(db.query_delete(&s), "Failed to delete entry by query");
log::error!("Failed to delete entry by query: {e}");
}
} }
(Some(s), None) => { (Some(s), None) => {
if let Ok(id) = s.parse::<u64>() { if let Ok(id) = s.parse::<u64>() {
use std::io::Cursor; use std::io::Cursor;
if let Err(e) = db.delete(Cursor::new(format!("{id}\n"))) { report_error(
log::error!("Failed to delete entry by id: {e}"); db.delete(Cursor::new(format!("{id}\n"))),
} "Failed to delete entry by id",
);
} else { } else {
if let Err(e) = db.query_delete(&s) { report_error(db.query_delete(&s), "Failed to delete entry by query");
log::error!("Failed to delete entry by query: {e}");
}
} }
} }
(None, _) => { (None, _) => {
if let Err(e) = db.delete(io::stdin()) { report_error(db.delete(io::stdin()), "Failed to delete entry from stdin");
log::error!("Failed to delete entry from stdin: {e}");
}
} }
(_, Some(_)) => { (_, Some(_)) => {
log::error!("Unknown type for --type. Use \"id\" or \"query\"."); log::error!("Unknown type for --type. Use \"id\" or \"query\".");
} }
}, },
Some(Command::Wipe) => { Some(Command::Wipe) => {
if let Err(e) = db.wipe() { report_error(db.wipe(), "Failed to wipe database");
log::error!("Failed to wipe database: {e}");
}
} }
Some(Command::Import { r#type }) => { Some(Command::Import { r#type }) => {