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}