infallible_builder_macro/
lib.rs1
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}