You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.4 KiB
64 lines
1.4 KiB
#![deny(clippy::all, clippy::pedantic)]
|
|
|
|
use std::error::Error as StdError;
|
|
use std::io;
|
|
use thiserror::Error;
|
|
|
|
#[derive(Error, Debug)]
|
|
#[error("implicit source")]
|
|
pub struct ImplicitSource {
|
|
source: io::Error,
|
|
}
|
|
|
|
#[derive(Error, Debug)]
|
|
#[error("explicit source")]
|
|
pub struct ExplicitSource {
|
|
source: String,
|
|
#[source]
|
|
io: io::Error,
|
|
}
|
|
|
|
#[derive(Error, Debug)]
|
|
#[error("boxed source")]
|
|
pub struct BoxedSource {
|
|
#[source]
|
|
source: Box<dyn StdError + Send + 'static>,
|
|
}
|
|
|
|
#[test]
|
|
fn test_implicit_source() {
|
|
let io = io::Error::new(io::ErrorKind::Other, "oh no!");
|
|
let error = ImplicitSource { source: io };
|
|
error.source().unwrap().downcast_ref::<io::Error>().unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn test_explicit_source() {
|
|
let io = io::Error::new(io::ErrorKind::Other, "oh no!");
|
|
let error = ExplicitSource {
|
|
source: String::new(),
|
|
io,
|
|
};
|
|
error.source().unwrap().downcast_ref::<io::Error>().unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn test_boxed_source() {
|
|
let source = Box::new(io::Error::new(io::ErrorKind::Other, "oh no!"));
|
|
let error = BoxedSource { source };
|
|
error.source().unwrap().downcast_ref::<io::Error>().unwrap();
|
|
}
|
|
|
|
macro_rules! error_from_macro {
|
|
($($variants:tt)*) => {
|
|
#[derive(Error)]
|
|
#[derive(Debug)]
|
|
pub enum MacroSource {
|
|
$($variants)*
|
|
}
|
|
}
|
|
}
|
|
|
|
// Test that we generate impls with the proper hygiene
|
|
error_from_macro!(#[error("Something")] Variant(#[from] io::Error));
|