add_macro_impl_error/
lib.rs

1extern crate proc_macro;
2use proc_macro::TokenStream;
3use venial::{ parse_item, Item };
4
5pub(crate) mod error;
6pub(crate) mod prelude;     use prelude::*;
7mod impl_enum;              use impl_enum::impl_error_enum;
8mod impl_struct;            use impl_struct::impl_error_struct;
9
10/// The implementation of trait 'Error' (writed for crate [add_macro](https://docs.rs/add_macro))
11/// 
12/// # Examples:
13/// ```
14/// use add_macro_impl_error::Error;
15/// 
16/// #[derive(Debug, Error)]
17/// enum CustomError {
18///     Io(std::io::Error),
19///     Wrong,
20/// }
21///
22/// impl std::fmt::Display for CustomError {
23///     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24///         match &self {
25///             Self::Io(e) => write!(f, "{e}"),
26///             Self::Wrong => write!(f, "Something went wrong.. =/"),
27///         }
28///     }
29/// }
30///
31/// #[derive(Debug, Error)]
32/// pub struct Error {
33///     source: CustomError,
34/// }
35///
36/// impl std::fmt::Display for Error {
37///     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
38///         write!(f, "{}", &self.source)
39///     }
40/// }
41///
42/// fn main() {
43///     let err = CustomError::Wrong;
44///     assert_eq!(format!("{err}"), "Something went wrong.. =/");
45/// 
46///     let err = Error { source: CustomError::Wrong };
47///     assert_eq!(format!("{err}"), "Something went wrong.. =/");
48/// }
49/// ```
50#[proc_macro_derive(Error, attributes(error))]
51pub fn derive_error(input: TokenStream) -> TokenStream {
52    let item = parse_item(input.into()).unwrap();
53    
54    match item {
55        Item::Enum(data) => impl_error_enum(data).unwrap().into(),
56        Item::Struct(data) => impl_error_struct(data).unwrap().into(),
57        _ => panic!("{}", Error::ImplementationError)
58    }
59}