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}