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}