| use anyhow::anyhow; |
| use std::error::Error as _; |
| use std::io; |
| use thiserror::Error; |
| |
| #[test] |
| fn test_transparent_struct() { |
| #[derive(Error, Debug)] |
| #[error(transparent)] |
| struct Error(ErrorKind); |
| |
| #[derive(Error, Debug)] |
| enum ErrorKind { |
| #[error("E0")] |
| E0, |
| #[error("E1")] |
| E1(#[from] io::Error), |
| } |
| |
| let error = Error(ErrorKind::E0); |
| assert_eq!("E0", error.to_string()); |
| assert!(error.source().is_none()); |
| |
| let io = io::Error::new(io::ErrorKind::Other, "oh no!"); |
| let error = Error(ErrorKind::from(io)); |
| assert_eq!("E1", error.to_string()); |
| error.source().unwrap().downcast_ref::<io::Error>().unwrap(); |
| } |
| |
| #[test] |
| fn test_transparent_enum() { |
| #[derive(Error, Debug)] |
| enum Error { |
| #[error("this failed")] |
| This, |
| #[error(transparent)] |
| Other(anyhow::Error), |
| } |
| |
| let error = Error::This; |
| assert_eq!("this failed", error.to_string()); |
| |
| let error = Error::Other(anyhow!("inner").context("outer")); |
| assert_eq!("outer", error.to_string()); |
| assert_eq!("inner", error.source().unwrap().to_string()); |
| } |
| |
| #[test] |
| fn test_transparent_enum_with_default_message() { |
| #[derive(Error, Debug)] |
| #[error("this failed: {0}_{1}")] |
| enum Error { |
| This(i32, i32), |
| #[error(transparent)] |
| Other(anyhow::Error), |
| } |
| |
| let error = Error::This(-1, -1); |
| assert_eq!("this failed: -1_-1", error.to_string()); |
| |
| let error = Error::Other(anyhow!("inner").context("outer")); |
| assert_eq!("outer", error.to_string()); |
| assert_eq!("inner", error.source().unwrap().to_string()); |
| } |
| |
| #[test] |
| fn test_anyhow() { |
| #[derive(Error, Debug)] |
| #[error(transparent)] |
| struct Any(#[from] anyhow::Error); |
| |
| let error = Any::from(anyhow!("inner").context("outer")); |
| assert_eq!("outer", error.to_string()); |
| assert_eq!("inner", error.source().unwrap().to_string()); |
| } |
| |
| #[test] |
| fn test_non_static() { |
| #[derive(Error, Debug)] |
| #[error(transparent)] |
| struct Error<'a> { |
| inner: ErrorKind<'a>, |
| } |
| |
| #[derive(Error, Debug)] |
| enum ErrorKind<'a> { |
| #[error("unexpected token: {:?}", token)] |
| Unexpected { token: &'a str }, |
| } |
| |
| let error = Error { |
| inner: ErrorKind::Unexpected { token: "error" }, |
| }; |
| assert_eq!("unexpected token: \"error\"", error.to_string()); |
| assert!(error.source().is_none()); |
| } |