func_core/
lib.rs

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        // panic!(TokenStream::from(expanded).to_string())
24        expanded.into()
25    } else {
26        panic!("Functional core macro is implemented only for named structs!");
27    }
28}