mirror of
https://github.com/eyre-rs/eyre.git
synced 2025-09-29 14:05:28 +00:00

This change adds `track_caller` annotations to `context.rs` on various trait helper methods (`wrap_err`) that were missing it. It also adds tests for these APIs to ensure that the location captured is in the file that created the error.
157 lines
4.0 KiB
Rust
157 lines
4.0 KiB
Rust
use std::panic::Location;
|
|
|
|
use eyre::WrapErr;
|
|
|
|
struct LocationHandler {
|
|
actual: Option<&'static str>,
|
|
expected: &'static str,
|
|
}
|
|
|
|
impl LocationHandler {
|
|
fn new(expected: &'static str) -> Self {
|
|
LocationHandler {
|
|
actual: None,
|
|
expected,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl eyre::EyreHandler for LocationHandler {
|
|
fn debug(
|
|
&self,
|
|
_error: &(dyn std::error::Error + 'static),
|
|
_f: &mut std::fmt::Formatter<'_>,
|
|
) -> std::fmt::Result {
|
|
// we assume that if the compiler is new enough to support
|
|
// `track_caller` that we will always have `actual` be `Some`, so we can
|
|
// safely skip the assertion if the location is `None` which should only
|
|
// happen in older rust versions.
|
|
if let Some(actual) = self.actual {
|
|
assert_eq!(self.expected, actual);
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn track_caller(&mut self, location: &'static Location<'static>) {
|
|
dbg!(location);
|
|
self.actual = Some(location.file());
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_wrap_err() {
|
|
let _ = eyre::set_hook(Box::new(|_e| {
|
|
let expected_location = file!();
|
|
Box::new(LocationHandler::new(expected_location))
|
|
}));
|
|
|
|
let err = std::fs::read_to_string("totally_fake_path")
|
|
.wrap_err("oopsie")
|
|
.unwrap_err();
|
|
|
|
// should panic if the location isn't in our crate
|
|
println!("{:?}", err);
|
|
}
|
|
|
|
#[test]
|
|
fn test_wrap_err_with() {
|
|
let _ = eyre::set_hook(Box::new(|_e| {
|
|
let expected_location = file!();
|
|
Box::new(LocationHandler::new(expected_location))
|
|
}));
|
|
|
|
let err = std::fs::read_to_string("totally_fake_path")
|
|
.wrap_err_with(|| "oopsie")
|
|
.unwrap_err();
|
|
|
|
// should panic if the location isn't in our crate
|
|
println!("{:?}", err);
|
|
}
|
|
|
|
#[test]
|
|
fn test_context() {
|
|
let _ = eyre::set_hook(Box::new(|_e| {
|
|
let expected_location = file!();
|
|
Box::new(LocationHandler::new(expected_location))
|
|
}));
|
|
|
|
let err = std::fs::read_to_string("totally_fake_path")
|
|
.context("oopsie")
|
|
.unwrap_err();
|
|
|
|
// should panic if the location isn't in our crate
|
|
println!("{:?}", err);
|
|
}
|
|
|
|
#[test]
|
|
fn test_with_context() {
|
|
let _ = eyre::set_hook(Box::new(|_e| {
|
|
let expected_location = file!();
|
|
Box::new(LocationHandler::new(expected_location))
|
|
}));
|
|
|
|
let err = std::fs::read_to_string("totally_fake_path")
|
|
.with_context(|| "oopsie")
|
|
.unwrap_err();
|
|
|
|
// should panic if the location isn't in our crate
|
|
println!("{:?}", err);
|
|
}
|
|
|
|
#[test]
|
|
fn test_option_compat_wrap_err() {
|
|
let _ = eyre::set_hook(Box::new(|_e| {
|
|
let expected_location = file!();
|
|
Box::new(LocationHandler::new(expected_location))
|
|
}));
|
|
|
|
use eyre::ContextCompat;
|
|
let err = None::<()>.wrap_err("oopsie").unwrap_err();
|
|
|
|
// should panic if the location isn't in our crate
|
|
println!("{:?}", err);
|
|
}
|
|
|
|
#[test]
|
|
fn test_option_compat_wrap_err_with() {
|
|
let _ = eyre::set_hook(Box::new(|_e| {
|
|
let expected_location = file!();
|
|
Box::new(LocationHandler::new(expected_location))
|
|
}));
|
|
|
|
use eyre::ContextCompat;
|
|
let err = None::<()>.wrap_err_with(|| "oopsie").unwrap_err();
|
|
|
|
// should panic if the location isn't in our crate
|
|
println!("{:?}", err);
|
|
}
|
|
|
|
#[test]
|
|
fn test_option_compat_context() {
|
|
let _ = eyre::set_hook(Box::new(|_e| {
|
|
let expected_location = file!();
|
|
Box::new(LocationHandler::new(expected_location))
|
|
}));
|
|
|
|
use eyre::ContextCompat;
|
|
let err = None::<()>.context("oopsie").unwrap_err();
|
|
|
|
// should panic if the location isn't in our crate
|
|
println!("{:?}", err);
|
|
}
|
|
|
|
#[test]
|
|
fn test_option_compat_with_context() {
|
|
let _ = eyre::set_hook(Box::new(|_e| {
|
|
let expected_location = file!();
|
|
Box::new(LocationHandler::new(expected_location))
|
|
}));
|
|
|
|
use eyre::ContextCompat;
|
|
let err = None::<()>.with_context(|| "oopsie").unwrap_err();
|
|
|
|
// should panic if the location isn't in our crate
|
|
println!("{:?}", err);
|
|
}
|