typed_builder_macro/
lib.rs
1use proc_macro2::TokenStream;
2use syn::{parse::Error, parse_macro_input, spanned::Spanned, DeriveInput};
3
4mod builder_attr;
5mod field_info;
6mod mutator;
7mod struct_info;
8mod util;
9
10#[proc_macro_derive(TypedBuilder, attributes(builder))]
11pub fn derive_typed_builder(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
12 let input = parse_macro_input!(input as DeriveInput);
13 match impl_my_derive(&input) {
14 Ok(output) => output.into(),
15 Err(error) => error.to_compile_error().into(),
16 }
17}
18
19fn impl_my_derive(ast: &syn::DeriveInput) -> Result<TokenStream, Error> {
20 let data = match &ast.data {
21 syn::Data::Struct(data) => match &data.fields {
22 syn::Fields::Named(fields) => struct_info::StructInfo::new(ast, fields.named.iter())?.derive()?,
23 syn::Fields::Unnamed(_) => return Err(Error::new(ast.span(), "TypedBuilder is not supported for tuple structs")),
24 syn::Fields::Unit => return Err(Error::new(ast.span(), "TypedBuilder is not supported for unit structs")),
25 },
26 syn::Data::Enum(_) => return Err(Error::new(ast.span(), "TypedBuilder is not supported for enums")),
27 syn::Data::Union(_) => return Err(Error::new(ast.span(), "TypedBuilder is not supported for unions")),
28 };
29 Ok(data)
30}