fadroma_derive_canonize/
lib.rs

1mod common;
2mod r#enum;
3mod generic;
4mod non_generic;
5mod generic_enum;
6
7use syn::{parse_macro_input, Item};
8use proc_macro2::Span;
9
10#[proc_macro_derive(Canonize)]
11pub fn derive_canonize(stream: proc_macro::TokenStream) -> proc_macro::TokenStream {
12    let item = parse_macro_input!(stream as Item);
13
14    match item {
15        Item::Struct(input) => {
16            if input.generics.params.len() == 0 {
17                non_generic::generate(input)
18            } else {
19                generic::generate(input)
20            }
21        }
22        Item::Enum(input) => {
23            if input.generics.params.len() == 0 {
24                r#enum::generate(input)
25            } else {
26                generic_enum::generate(input)
27            }
28        }
29        _ => {
30            let error = syn::Error::new(Span::call_site(), "Expecting a struct or enum definition.");
31
32            error.to_compile_error().into()
33        }
34    }
35}