| #![allow( |
| // Clippy bug: https://github.com/rust-lang/rust-clippy/issues/7422 |
| clippy::nonstandard_macro_braces, |
| )] |
| |
| use anyhow::anyhow; |
| use std::error::Error as StdError; |
| use std::io; |
| use thiserror::Error; |
| |
| #[derive(Error, Debug)] |
| #[error("outer")] |
| struct MyError { |
| source: io::Error, |
| } |
| |
| #[test] |
| fn test_boxed_str() { |
| let error = Box::<dyn StdError + Send + Sync>::from("oh no!"); |
| let error = anyhow!(error); |
| assert_eq!("oh no!", error.to_string()); |
| assert_eq!( |
| "oh no!", |
| error |
| .downcast_ref::<Box<dyn StdError + Send + Sync>>() |
| .unwrap() |
| .to_string() |
| ); |
| } |
| |
| #[test] |
| fn test_boxed_thiserror() { |
| let error = MyError { |
| source: io::Error::new(io::ErrorKind::Other, "oh no!"), |
| }; |
| let error = anyhow!(error); |
| assert_eq!("oh no!", error.source().unwrap().to_string()); |
| } |
| |
| #[test] |
| fn test_boxed_anyhow() { |
| let error = anyhow!("oh no!").context("it failed"); |
| let error = anyhow!(error); |
| assert_eq!("oh no!", error.source().unwrap().to_string()); |
| } |