Skip to main content

errorx_macros/
lib.rs

1mod params;
2mod variant;
3
4pub(crate) use params::*;
5
6use proc_macro::TokenStream;
7use quote::quote;
8
9#[proc_macro_derive(Error, attributes(error))]
10pub fn derive_error(tokens: TokenStream) -> TokenStream {
11    let input = syn::parse_macro_input!(tokens as syn::DeriveInput);
12
13    return match &input.data {
14        syn::Data::Enum(ty) => render(&input, ty),
15        _ => quote::quote!(compile_error!("unsupported Error type")),
16    }
17    .into();
18}
19
20fn render(input: &syn::DeriveInput, data: &syn::DataEnum) -> proc_macro2::TokenStream {
21    let display = variant::display::render(input, data);
22    let error = variant::error::render(input, data);
23    let to_error = variant::to_error::render(input, data);
24
25    return quote! {
26        #display
27        #error
28        #to_error
29    };
30}