    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35

    #![allow(
        clippy::blocks_in_if_conditions,
        clippy::cast_lossless,
        clippy::cast_possible_truncation,
        clippy::manual_find,
        clippy::manual_map,
        clippy::map_unwrap_or,
        clippy::needless_pass_by_value,
        clippy::option_if_let_else,
        clippy::range_plus_one,
        clippy::single_match_else,
        clippy::too_many_lines,
        clippy::wrong_self_convention
    )]

    extern crate proc_macro;

    mod ast;
    mod attr;
    mod expand;
    mod fmt;
    mod generics;
    mod prop;
    mod valid;

    use proc_macro::TokenStream;
    use syn::{parse_macro_input, DeriveInput};

    #[proc_macro_derive(Error, attributes(backtrace, error, from, source))]
    pub fn derive_error(input: TokenStream) -> TokenStream {
        let input = parse_macro_input!(input as DeriveInput);
        expand::derive(&input)
            .unwrap_or_else(|err| err.to_compile_error())
            .into()
    }