infallible_builder_macro/
lib.rs

1
2use proc_macro::TokenStream;
3use quote::quote;
4use syn::{parse_macro_input, DeriveInput};
5
6#[allow(non_snake_case)]
7#[proc_macro_attribute]
8pub fn Builder(_attrs: TokenStream, item: TokenStream) -> TokenStream {
9    let item = parse_macro_input!(item as DeriveInput);
10    let name = item.ident.clone();
11    let builder_name = quote::format_ident!("{name}Builder");
12
13    TokenStream::from(quote! {
14        #[derive(infallible_builder::derive_builder::Builder)]
15        #[builder(
16            default,
17            pattern = "owned",
18            crate = "infallible_builder::derive_builder",
19            build_fn(private, name = "build_fallible", error = "std::convert::Infallible"),
20            setter(into, strip_option),
21        )]
22        #item
23
24        impl #name {
25            pub fn builder() -> #builder_name {
26                #builder_name::default()
27            }
28        }
29
30        impl #builder_name {
31            pub fn build(self) -> #name {
32                use infallible_builder::UnwrapInfallible;
33                self.build_fallible().unwrap_infallible()
34            }
35        }
36    })
37}