quick_builder_derive/
lib.rs

1use builder::make_builder;
2use detail::StructDeriveInput;
3use quote::quote;
4use syn::{parse_macro_input, DeriveInput};
5
6mod builder;
7mod detail;
8mod error;
9mod validation;
10
11/// helper macro for returning compile errors even in functions which don't return
12/// Result<T,E>, but instead return token streams.
13macro_rules! try2 {
14    ($result:expr) => {
15        match $result {
16            Ok(payload) => payload,
17            Err(err) => {
18                return err.into();
19            }
20        }
21    };
22}
23
24#[proc_macro_derive(QuickBuilder, attributes(invariant))]
25pub fn quick_builder(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
26    let input: StructDeriveInput = try2!(parse_macro_input!(input as DeriveInput).try_into());
27
28    let builder = try2!(make_builder(&input));
29
30    quote! {
31        #builder
32    }
33    .into()
34}