utils_soeur/
builder.rs

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}