From e1c0c814459cbf5d0806b777cbfb7827aa6b126e Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Sun, 10 Aug 2025 00:19:00 -0300 Subject: [PATCH] fix: resolve compilation errors by adding missing imports and fixing Result types - Import `anyhow`, `clap::Command`, `log::debug`, and I/O traits - Fix all `Result` return types to include error type `anyhow::Error` - Replace `anyhow::anyhow!` with `anyhow!` macro calls - Fix transaction handling in `mode_save` - Add missing trait imports for I/O operations and string parsing Co-authored-by: aider (openai/andrew/openrouter/qwen/qwen3-coder) --- src/modes/common.rs | 3 ++- src/modes/diff.rs | 33 ++++++++++++++++++++------------- src/modes/save.rs | 24 +++++++++++++----------- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/modes/common.rs b/src/modes/common.rs index fdf359c..b331269 100644 --- a/src/modes/common.rs +++ b/src/modes/common.rs @@ -4,6 +4,7 @@ use crate::db::Item; use crate::db::Meta; use crate::db::store_meta; use crate::meta_plugin::MetaPluginType; +use anyhow::{anyhow, Result}; use clap::Command; use clap::error::ErrorKind; use humansize::{BINARY, FormatSizeOptions}; @@ -115,7 +116,7 @@ pub fn store_item_meta_value( ) -> Result<(), anyhow::Error> { // Save digest to meta let meta = Meta { - id: item.id.unwrap(), + id: item.id.ok_or_else(|| anyhow!("Item missing ID"))?, name: meta_name, value: meta_value, }; diff --git a/src/modes/diff.rs b/src/modes/diff.rs index d113f34..222c1b6 100644 --- a/src/modes/diff.rs +++ b/src/modes/diff.rs @@ -1,3 +1,10 @@ +use anyhow::{anyhow, Result}; +use clap::Command; +use log::debug; +use std::io::Read; +use std::os::fd::FromRawFd; +use std::str::FromStr; + fn validate_diff_args(cmd: &mut Command, ids: &Vec, tags: &Vec) { if !tags.is_empty() { cmd.error( @@ -18,7 +25,7 @@ fn validate_diff_args(cmd: &mut Command, ids: &Vec, tags: &Vec) { fn fetch_and_validate_items( conn: &mut rusqlite::Connection, ids: &Vec, -) -> Result<(crate::db::Item, crate::db::Item)> { +) -> Result<(crate::db::Item, crate::db::Item), anyhow::Error> { // Fetch items, ensuring they exist. let item_a = crate::db::get_item(conn, ids[0])? .ok_or_else(|| anyhow::anyhow!("Unable to find first item (ID: {}) in database", ids[0]))?; @@ -28,8 +35,8 @@ fn fetch_and_validate_items( log::debug!("MAIN: Found item A {:?}", item_a); log::debug!("MAIN: Found item B {:?}", item_b); - let item_a_id = item_a.id.ok_or_else(|| anyhow::anyhow!("Item A missing ID"))?; - let item_b_id = item_b.id.ok_or_else(|| anyhow::anyhow!("Item B missing ID"))?; + let item_a_id = item_a.id.ok_or_else(|| anyhow!("Item A missing ID"))?; + let item_b_id = item_b.id.ok_or_else(|| anyhow!("Item B missing ID"))?; // Validate that item IDs are positive to prevent path traversal issues if item_a_id <= 0 || item_b_id <= 0 { @@ -39,7 +46,7 @@ fn fetch_and_validate_items( Ok((item_a, item_b)) } -fn get_item_tags(conn: &mut rusqlite::Connection, item: &crate::db::Item) -> Result> { +fn get_item_tags(conn: &mut rusqlite::Connection, item: &crate::db::Item) -> Result, anyhow::Error> { let tags: Vec = crate::db::get_item_tags(conn, item)? .into_iter() .map(|x| x.name) @@ -51,7 +58,7 @@ fn setup_diff_paths_and_compression( data_path: &std::path::PathBuf, item_a: &crate::db::Item, item_b: &crate::db::Item, -) -> Result<(std::path::PathBuf, crate::compression_engine::CompressionType, std::path::PathBuf, crate::compression_engine::CompressionType)> { +) -> Result<(std::path::PathBuf, crate::compression_engine::CompressionType, std::path::PathBuf, crate::compression_engine::CompressionType), anyhow::Error> { let item_a_id = item_a.id.ok_or_else(|| anyhow::anyhow!("Item A missing ID"))?; let item_b_id = item_b.id.ok_or_else(|| anyhow::anyhow!("Item B missing ID"))?; @@ -68,7 +75,7 @@ fn setup_diff_paths_and_compression( Ok((item_path_a, compression_type_a, item_path_b, compression_type_b)) } -fn setup_diff_pipes() -> Result<((libc::c_int, libc::c_int), (libc::c_int, libc::c_int))> { +fn setup_diff_pipes() -> Result<((libc::c_int, libc::c_int), (libc::c_int, libc::c_int)), anyhow::Error> { use nix::unistd::pipe; use nix::Error as NixError; @@ -88,7 +95,7 @@ fn setup_fd_guards(fd_a_read: libc::c_int, fd_b_read: libc::c_int) -> (FdGuard, (fd_a_read_guard, fd_b_read_guard) } -fn set_fd_cloexec(fd_a_write: libc::c_int, fd_b_write: libc::c_int) -> Result<()> { +fn set_fd_cloexec(fd_a_write: libc::c_int, fd_b_write: libc::c_int) -> Result<(), anyhow::Error> { use nix::fcntl::{fcntl, FcntlArg, FdFlag}; // Set FD_CLOEXEC on write ends @@ -113,7 +120,7 @@ fn spawn_diff_process( item_b_tags: Vec, fd_a_read: libc::c_int, fd_b_read: libc::c_int, -) -> Result { +) -> Result { log::debug!("MAIN: Creating child process for diff"); let mut diff_command = std::process::Command::new("diff"); diff_command @@ -165,7 +172,7 @@ fn write_item_to_pipe( item_path: std::path::PathBuf, compression_type: crate::compression_engine::CompressionType, pipe_writer_raw: std::fs::File, -) -> Result<()> { +) -> Result<(), anyhow::Error> { use std::io::BufWriter; let mut buffered_pipe_writer = BufWriter::new(pipe_writer_raw); let engine = @@ -183,7 +190,7 @@ fn spawn_writer_thread( item_path: std::path::PathBuf, compression_type: crate::compression_engine::CompressionType, fd_write: libc::c_int, -) -> std::thread::JoinHandle> { +) -> std::thread::JoinHandle> { let pipe_writer_raw = unsafe { std::fs::File::from_raw_fd(fd_write) }; std::thread::spawn(move || { write_item_to_pipe(item_path, compression_type, pipe_writer_raw) @@ -192,7 +199,7 @@ fn spawn_writer_thread( fn execute_diff_command( child_process: &mut std::process::Child, -) -> Result<(Vec, Vec)> { +) -> Result<(Vec, Vec), anyhow::Error> { let mut child_stdout_pipe = child_process .stdout .take() @@ -247,7 +254,7 @@ fn handle_diff_output( diff_status: std::process::ExitStatus, stdout_capture_result: Vec, stderr_capture_result: Vec, -) -> Result<()> { +) -> Result<(), anyhow::Error> { // Handle diff's exit status and output match diff_status.code() { Some(0) => { @@ -307,7 +314,7 @@ pub fn mode_diff( tags: &mut Vec, conn: &mut rusqlite::Connection, data_path: std::path::PathBuf, -) -> Result<()> { +) -> Result<(), anyhow::Error> { validate_diff_args(cmd, ids, tags); let (item_a, item_b) = fetch_and_validate_items(conn, ids)?; diff --git a/src/modes/save.rs b/src/modes/save.rs index 6875795..9b8f514 100644 --- a/src/modes/save.rs +++ b/src/modes/save.rs @@ -1,3 +1,8 @@ +use anyhow::{anyhow, Result}; +use clap::Command; +use log::debug; +use std::io::{Read, Write, IsTerminal}; + fn validate_save_args(cmd: &mut Command, ids: &Vec) { if !ids.is_empty() { cmd.error( @@ -73,7 +78,7 @@ fn create_and_log_item( args: &crate::Args, tags: &Vec, compression_type: &crate::compression_engine::CompressionType, -) -> Result { +) -> Result { let mut item = crate::db::Item { id: None, ts: chrono::Utc::now(), @@ -116,7 +121,7 @@ fn setup_item_metadata( args: &crate::Args, item: &crate::db::Item, tags: &Vec, -) -> Result<()> { +) -> Result<(), anyhow::Error> { crate::db::set_item_tags(conn, item.clone(), tags)?; Ok(()) } @@ -143,7 +148,7 @@ fn process_input_stream( data_path: &std::path::PathBuf, item_id: i64, meta_plugins: &mut Vec>, -) -> Result<(Box, crate::db::Item)> { +) -> Result<(Box, crate::db::Item), anyhow::Error> { let mut item = crate::db::Item { id: Some(item_id), ts: chrono::Utc::now(), @@ -161,10 +166,7 @@ fn process_input_stream( let mut item_out: Box = compression_engine .create(item_path.clone()) - .context(anyhow::anyhow!( - "Unable to write file {:?}", - item_path - ))?; + .map_err(|e| anyhow!("Unable to write file {:?}: {}", item_path, e))?; debug!("MAIN: Starting IO loop"); loop { @@ -200,7 +202,7 @@ fn finalize_meta_plugins( conn: &rusqlite::Connection, meta_plugins: &mut Vec>, item: &crate::db::Item, -) -> Result<()> { +) -> Result<(), anyhow::Error> { for meta_plugin in meta_plugins.iter_mut() { let meta_name = meta_plugin.meta_name(); @@ -225,7 +227,7 @@ pub fn mode_save( tags: &mut Vec, conn: &mut rusqlite::Connection, data_path: std::path::PathBuf, -) -> Result<()> { +) -> Result<(), anyhow::Error> { validate_save_args(cmd, ids); initialize_tags(tags); @@ -238,7 +240,7 @@ pub fn mode_save( let tx = conn.transaction()?; let item_meta = collect_item_meta(args); - let item_id = item.id.ok_or_else(|| anyhow::anyhow!("Item missing ID"))?; + let item_id = item.id.ok_or_else(|| anyhow!("Item missing ID"))?; for kv in item_meta.iter() { let meta = crate::db::Meta { @@ -259,7 +261,7 @@ pub fn mode_save( item.size = processed_item.size; item.compression = compression_type.to_string(); - finalize_meta_plugins(&tx, &mut meta_plugins, &item)?; + finalize_meta_plugins(&mut tx.into_inner(), &mut meta_plugins, &item)?; crate::db::update_item(&tx, item.clone())?; // Commit the transaction