1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::parse_macro_input;
6
7mod generate;
8
9#[proc_macro_derive(FunctionalCore)]
10pub fn derive_functional_core(input: TokenStream) -> TokenStream {
11 let input = parse_macro_input!(input as syn::DeriveInput);
12 let (impl_generics, ty_generics, where_clause) = &input.generics.split_for_impl();
13 let struct_name: &syn::Ident = &input.ident;
14 if let syn::Data::Struct(syn::DataStruct { ref fields, .. }) = input.data {
15 let new = generate::new(struct_name, fields, ty_generics);
16 let getters = generate::getters(fields);
17 let expanded = quote! {
18 impl #impl_generics #struct_name #ty_generics #where_clause {
19 #new
20 #getters
21 }
22 };
23 expanded.into()
25 } else {
26 panic!("Functional core macro is implemented only for named structs!");
27 }
28}