diff --git a/crates/typos-cli/src/file.rs b/crates/typos-cli/src/file.rs index 16767e2..9061c5e 100644 --- a/crates/typos-cli/src/file.rs +++ b/crates/typos-cli/src/file.rs @@ -431,10 +431,14 @@ fn read_file( ) -> Result<(Vec, content_inspector::ContentType), std::io::Error> { let buffer = if path == std::path::Path::new("-") { let mut buffer = Vec::new(); - report_result(std::io::stdin().read_to_end(&mut buffer), reporter)?; + report_result( + std::io::stdin().read_to_end(&mut buffer), + Some(path), + reporter, + )?; buffer } else { - report_result(std::fs::read(path), reporter)? + report_result(std::fs::read(path), Some(path), reporter)? }; let content_type = content_inspector::inspect(&buffer); @@ -460,7 +464,7 @@ fn read_file( encoding_rs::DecoderResult::InputEmpty => Ok(decoded), _ => Err(format!("invalid UTF-16LE encoding at byte {} in {}", written, path.display())), }; - let buffer = report_result(decoded, reporter)?; + let buffer = report_result(decoded, Some(path), reporter)?; (buffer.into_bytes(), content_type) } content_inspector::ContentType::UTF_16BE => { @@ -473,7 +477,7 @@ fn read_file( encoding_rs::DecoderResult::InputEmpty => Ok(decoded), _ => Err(format!("invalid UTF-16BE encoding at byte {} in {}", written, path.display())), }; - let buffer = report_result(decoded, reporter)?; + let buffer = report_result(decoded, Some(path), reporter)?; (buffer.into_bytes(), content_type) }, }; @@ -496,7 +500,7 @@ fn write_file( | content_inspector::ContentType::UTF_8 | content_inspector::ContentType::UTF_8_BOM => buffer, content_inspector::ContentType::UTF_16LE => { - let buffer = report_result(String::from_utf8(buffer), reporter)?; + let buffer = report_result(String::from_utf8(buffer), Some(path), reporter)?; if buffer.is_empty() { // Error occurred, don't clear out the file return Ok(()); @@ -509,7 +513,7 @@ fn write_file( encoded.into_owned() } content_inspector::ContentType::UTF_16BE => { - let buffer = report_result(String::from_utf8(buffer), reporter)?; + let buffer = report_result(String::from_utf8(buffer), Some(path), reporter)?; if buffer.is_empty() { // Error occurred, don't clear out the file return Ok(()); @@ -524,9 +528,9 @@ fn write_file( }; if path == std::path::Path::new("-") { - report_result(std::io::stdout().write_all(&buffer), reporter)?; + report_result(std::io::stdout().write_all(&buffer), Some(path), reporter)?; } else { - report_result(std::fs::write(path, buffer), reporter)?; + report_result(std::fs::write(path, buffer), Some(path), reporter)?; } Ok(()) @@ -547,20 +551,26 @@ fn check_bytes<'a>( fn report_result( value: Result, + path: Option<&std::path::Path>, reporter: &dyn report::Report, ) -> Result { let buffer = match value { Ok(value) => value, Err(err) => { - report_error(err, reporter)?; + report_error(err, path, reporter)?; Default::default() } }; Ok(buffer) } -fn report_error(err: E, reporter: &dyn report::Report) -> Result<(), std::io::Error> { - let msg = report::Error::new(err.to_string()); +fn report_error( + err: E, + path: Option<&std::path::Path>, + reporter: &dyn report::Report, +) -> Result<(), std::io::Error> { + let mut msg = report::Error::new(err.to_string()); + msg.context = path.map(|path| report::Context::Path(report::PathContext { path })); reporter.report(msg.into())?; Ok(()) } @@ -672,7 +682,7 @@ fn walk_entry( let entry = match entry { Ok(entry) => entry, Err(err) => { - report_error(err, reporter)?; + report_error(err, None, reporter)?; return Ok(()); } };