183 lines
4.6 KiB
Rust
183 lines
4.6 KiB
Rust
use std::panic::Location;
|
|
|
|
use eyre::{OptionExt as _, 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 = read_path("totally_fake_path")
|
|
.wrap_err("oopsie")
|
|
.unwrap_err();
|
|
|
|
// should panic if the location isn't in our crate
|
|
println!("{:?}", err);
|
|
}
|
|
|
|
#[cfg(not(miri))]
|
|
fn read_path(path: &str) -> Result<String, std::io::Error> {
|
|
std::fs::read_to_string(path)
|
|
}
|
|
|
|
#[cfg(miri)]
|
|
fn read_path(_path: &str) -> Result<String, std::io::Error> {
|
|
// Miri doesn't support reading files, so we just return an error
|
|
Err(std::io::Error::new(
|
|
std::io::ErrorKind::Other,
|
|
"Miri doesn't support reading files",
|
|
))
|
|
}
|
|
|
|
#[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 = read_path("totally_fake_path")
|
|
.wrap_err_with(|| "oopsie")
|
|
.unwrap_err();
|
|
|
|
// should panic if the location isn't in our crate
|
|
println!("{:?}", err);
|
|
}
|
|
|
|
#[test]
|
|
fn test_option_ok_or_eyre() {
|
|
let _ = eyre::set_hook(Box::new(|_e| {
|
|
let expected_location = file!();
|
|
Box::new(LocationHandler::new(expected_location))
|
|
}));
|
|
|
|
let err = None::<()>.ok_or_eyre("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 = read_path("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 = read_path("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);
|
|
}
|