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 36 37 38
use proc_macro::TokenStream; use quote::ToTokens; use syn::{parse_macro_input, DeriveInput}; mod attr; mod fn_impl; mod parsers; mod enum_impl; mod struct_impl; #[proc_macro_derive(Parse, attributes(nommy))] pub fn derive_parse(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); let DeriveInput { attrs, vis: _, ident, generics, data, } = input; match data { syn::Data::Struct(s) => match s.fields { syn::Fields::Named(fields) => { struct_impl::Named::new(ident, generics, attrs, fields).into_token_stream() } syn::Fields::Unnamed(fields) => { struct_impl::Unnamed::new(ident, generics, attrs, fields).into_token_stream() } syn::Fields::Unit => struct_impl::Unit::new(ident, generics, attrs).into_token_stream(), }, syn::Data::Enum(enum_data) => { enum_impl::Enum::new(ident, generics, attrs, enum_data).into_token_stream() } syn::Data::Union(_) => panic!("unions not supported"), } .into() }