From 7da9ce228e0e111a8d41adc93e8cae24674983e1 Mon Sep 17 00:00:00 2001 From: DarkAtra Date: Tue, 21 Jul 2026 19:49:42 +0200 Subject: [PATCH] chore: improve error message for failed std::fs::read calls --- crates/apt-convert/src/lib.rs | 12 ++++++++++-- crates/apt/src/error.rs | 14 ++++++++++++++ crates/apt/src/lib.rs | 17 ++++++++++++++--- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/crates/apt-convert/src/lib.rs b/crates/apt-convert/src/lib.rs index 28756fd..c7c8203 100644 --- a/crates/apt-convert/src/lib.rs +++ b/crates/apt-convert/src/lib.rs @@ -25,6 +25,8 @@ use thiserror::Error; pub enum Error { #[error("apt error: {0}")] Apt(#[from] apt::Error), + #[error("loading APT movie {}: {source}", base.display())] + LoadMovie { base: PathBuf, source: apt::Error }, #[error("apt-aux error: {0}")] Aux(String), #[error("swf read error: {0}")] @@ -92,7 +94,10 @@ pub struct ConvertedMovie { /// those too. pub fn convert_movie(base: &Path, options: &ConvertOptions) -> Result> { let base = apt::base_path(base); - let file = apt::AptFile::load(&base)?; + let file = apt::AptFile::load(&base).map_err(|source| Error::LoadMovie { + base: base.clone(), + source, + })?; convert_loaded_movie(&base, &file, options) } @@ -135,7 +140,10 @@ pub fn convert_movie_with_imports( Some(n) if seen.insert(n.to_string()) => n.to_string(), _ => continue, // unnamed, or already converted }; - let file = apt::AptFile::load(&base)?; + let file = apt::AptFile::load(&base).map_err(|source| Error::LoadMovie { + base: base.clone(), + source, + })?; if !options.inline_imports { for import in &file.movie.imports { if !seen.contains(&import.movie) { diff --git a/crates/apt/src/error.rs b/crates/apt/src/error.rs index aeedde6..72002e3 100644 --- a/crates/apt/src/error.rs +++ b/crates/apt/src/error.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + use thiserror::Error; #[derive(Debug, Error)] @@ -5,6 +7,18 @@ pub enum Error { #[error("io error: {0}")] Io(#[from] std::io::Error), + #[error("reading {}: {source}", path.display())] + ReadFile { + path: PathBuf, + source: std::io::Error, + }, + + #[error("parsing APT movie {}: {source}", base.display())] + Parse { + base: PathBuf, + source: Box, + }, + #[error("not an APT file: bad header tag")] BadAptTag, diff --git a/crates/apt/src/lib.rs b/crates/apt/src/lib.rs index b875497..7bee55e 100644 --- a/crates/apt/src/lib.rs +++ b/crates/apt/src/lib.rs @@ -52,9 +52,20 @@ impl AptFile { /// Load from `.apt` + `.const`. `path` may be either file or the base name. pub fn load(path: &Path) -> Result { let base = base_path(path); - let apt_data = std::fs::read(base.with_extension("apt"))?; - let const_data = std::fs::read(base.with_extension("const"))?; - Self::read(&apt_data, &const_data) + let apt_path = base.with_extension("apt"); + let const_path = base.with_extension("const"); + let apt_data = std::fs::read(&apt_path).map_err(|source| Error::ReadFile { + path: apt_path, + source, + })?; + let const_data = std::fs::read(&const_path).map_err(|source| Error::ReadFile { + path: const_path, + source, + })?; + Self::read(&apt_data, &const_data).map_err(|source| Error::Parse { + base, + source: Box::new(source), + }) } }