macon_derive/
lib.rs

1//! Macro implementation crate generating builders for [macon](https://crates.io/crates/macon/0.3.0).
2//!
3//! See it for all details.
4//!
5
6
7use syn::{
8    parse_macro_input,
9    DeriveInput,
10};
11
12mod attributes;
13mod common;
14mod config;
15mod model;
16mod generators;
17
18/// Derive macro to generate builder for your structs. See crate documentation for usage.
19///
20/// ```compile_fail
21/// # #[macro_use] extern crate macon;
22/// #[derive(Builder)]
23/// #[derive(Debug,PartialEq,)]
24/// struct MyType {
25///   integer: i32,
26///   string: String,
27///   optional: Option<String>,
28/// }
29///
30/// let built = MyType::builder()
31///     .integer(42)
32///     .string("foobar")
33///     .build();
34///
35/// assert_eq!(
36///   MyType {
37///     integer: 42,
38///     string: String::from("foobar"),
39///     optional: None,
40///   },
41///   built,
42/// );
43/// ```
44#[proc_macro_derive(Builder, attributes(builder))]
45pub fn builder_macro_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
46    let input = parse_macro_input!(input as DeriveInput);
47    let builder = model::Builder::from_input(input).unwrap();
48    let generator: Box<dyn generators::Generator> = builder.into();
49    let value = generator.all();
50    // eprintln!("{:#?}", value);
51    proc_macro::TokenStream::from(value)
52}