From c67a8e877f0e0f75b5d59d67c5885007d1812ffd Mon Sep 17 00:00:00 2001 From: nerdCopter <56646290+nerdCopter@users.noreply.github.com> Date: Sat, 13 Dec 2025 10:21:44 -0600 Subject: [PATCH 1/2] fix: add missing directory creation to GPX and event exports - Add std::fs::create_dir_all() to export_to_gpx before file creation - Add std::fs::create_dir_all() to export_to_event before file creation - Both functions now match export_to_csv behavior for directory handling - Fixes issue where exports to non-existent directories would fail with ENOENT Resolves: #26 --- src/export.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/export.rs b/src/export.rs index 8507ed5..36cfa94 100644 --- a/src/export.rs +++ b/src/export.rs @@ -377,6 +377,11 @@ pub fn export_to_gpx( .map(Path::new) .unwrap_or_else(|| input_path.parent().unwrap_or(Path::new("."))); + // Create output directory if it doesn't exist (match export_to_csv behavior) + if !output_dir.exists() { + std::fs::create_dir_all(output_dir)?; + } + // Use consistent naming: only add suffix for multiple logs let log_suffix = if total_logs > 1 { format!(".{:02}", log_index + 1) @@ -442,6 +447,11 @@ pub fn export_to_event( .map(Path::new) .unwrap_or_else(|| input_path.parent().unwrap_or(Path::new("."))); + // Create output directory if it doesn't exist (match export_to_csv behavior) + if !output_dir.exists() { + std::fs::create_dir_all(output_dir)?; + } + // Use consistent naming: only add suffix for multiple logs let log_suffix = if total_logs > 1 { format!(".{:02}", log_index + 1) From 837c2986aec460d6f81b1af31b07cc6536dfd43b Mon Sep 17 00:00:00 2001 From: nerdCopter <56646290+nerdCopter@users.noreply.github.com> Date: Sat, 13 Dec 2025 10:31:12 -0600 Subject: [PATCH 2/2] refactor: use compute_export_paths in GPX and event exports for DRY naming - Replace duplicate filename construction logic in export_to_gpx and export_to_event - Both functions now use compute_export_paths() for consistent naming with CSV exports - Reduces code duplication and improves maintainability - Ensures naming scheme stays in sync across all export formats Related to: #26 --- src/export.rs | 52 ++++++++++++++++----------------------------------- 1 file changed, 16 insertions(+), 36 deletions(-) diff --git a/src/export.rs b/src/export.rs index 36cfa94..902a490 100644 --- a/src/export.rs +++ b/src/export.rs @@ -369,28 +369,18 @@ pub fn export_to_gpx( return Ok(()); } - let base_name = extract_base_name(input_path); - - let output_dir = export_options - .output_dir - .as_deref() - .map(Path::new) - .unwrap_or_else(|| input_path.parent().unwrap_or(Path::new("."))); + // Use compute_export_paths to ensure consistent naming with CSV exports + let (_, _, gpx_path, _) = + compute_export_paths(input_path, export_options, log_index + 1, total_logs); // Create output directory if it doesn't exist (match export_to_csv behavior) - if !output_dir.exists() { - std::fs::create_dir_all(output_dir)?; + if let Some(parent) = gpx_path.parent() { + if !parent.exists() { + std::fs::create_dir_all(parent)?; + } } - // Use consistent naming: only add suffix for multiple logs - let log_suffix = if total_logs > 1 { - format!(".{:02}", log_index + 1) - } else { - "".to_string() - }; - let gpx_filename = output_dir.join(format!("{}{}.gps.gpx", base_name, log_suffix)); - - let mut gpx_file = File::create(&gpx_filename)?; + let mut gpx_file = File::create(&gpx_path)?; writeln!(gpx_file, r#""#)?; writeln!( gpx_file, @@ -439,28 +429,18 @@ pub fn export_to_event( return Ok(()); } - let base_name = extract_base_name(input_path); - - let output_dir = export_options - .output_dir - .as_deref() - .map(Path::new) - .unwrap_or_else(|| input_path.parent().unwrap_or(Path::new("."))); + // Use compute_export_paths to ensure consistent naming with CSV exports + let (_, _, _, event_path) = + compute_export_paths(input_path, export_options, log_index + 1, total_logs); // Create output directory if it doesn't exist (match export_to_csv behavior) - if !output_dir.exists() { - std::fs::create_dir_all(output_dir)?; + if let Some(parent) = event_path.parent() { + if !parent.exists() { + std::fs::create_dir_all(parent)?; + } } - // Use consistent naming: only add suffix for multiple logs - let log_suffix = if total_logs > 1 { - format!(".{:02}", log_index + 1) - } else { - "".to_string() - }; - let event_filename = output_dir.join(format!("{}{}.event", base_name, log_suffix)); - - let mut event_file = File::create(&event_filename)?; + let mut event_file = File::create(&event_path)?; // Export as JSONL format (individual JSON objects per line) to match blackbox_decode for event in event_frames.iter() {