1#[macro_export]
2macro_rules! builder {
3 ($(#[$attr:meta])* $vis:vis $name:ident$(<$($g:ident),*>)? { $($(#[$field_attr:meta])* $field_name:ident: $field_type:ty $(=> { $(#[$setter_attr:meta])* $($t:tt)* })?),* }) => {
4 $(#[$attr])* $vis struct $name$(<$($g),*>)? {
5 $($(#[$field_attr])* $field_name: $field_type),*
6 }
7
8 impl$(<$($g),*>)? $name$(<$($g),*>)? {
9 #[allow(dead_code)]
10 pub fn new() -> Self {
11 Default::default()
12 }
13 }
14
15 impl$(<$($g),*>)? $name$(<$($g),*>)? {
16 $($crate::builder_setter!{$field_name, $field_type $(=> { $(#[$setter_attr])* $($t)* })? })*
17 }
18 };
19}
20
21#[macro_export]
22macro_rules! builder_setter {
23 ($field_name:ident, $field_type:ty => { $(#[$setter_attr:meta])* $($t:tt)* }) => {
24 #[inline]
25 #[allow(dead_code)]
26 $(#[$setter_attr:meta])*
27 pub fn $($t)*
28 };
29 ($field_name:ident, $field_type:ty) => {
30 #[inline]
31 #[allow(dead_code)]
32 pub fn $field_name(mut self, t: $field_type) -> Self {
33 self.$field_name = t;
34 self
35 }
36 };
37}