Skip to main content

derive_default_constructor/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::parse_macro_input;
4
5/// Derive macro for generating a default constructor for structs.
6/// Simply aliases the `Default` trait to provide a `new` method.
7#[proc_macro_derive(DefaultConstructor)]
8pub fn derive_build(input: TokenStream) -> TokenStream {
9    let ast = parse_macro_input!(input as syn::DeriveInput);
10    generate_impl(ast).into()
11}
12
13fn generate_impl(ast: syn::DeriveInput) -> proc_macro2::TokenStream {
14    let struct_name = &ast.ident;
15    let params = ast.generics.params.iter();
16    let generic_params = quote! {#(#params)*};
17    let where_clause = ast.generics.where_clause.as_ref();
18    let where_clause = if let Some(where_clause) = where_clause {
19        quote! { #where_clause }
20    } else {
21        quote! {}
22    };
23
24    let expanded = quote! {
25      impl<#generic_params> #struct_name<#generic_params> #where_clause {
26        pub fn new() -> Self {
27          Self {
28            ..Default::default()
29          }
30        }
31      }
32    };
33    expanded
34}