concision_core/macros/
builder.rs

1/*
2    Appellation: builder <macros>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5
6#[macro_export]
7macro_rules! builder {
8    ($(#[derive($($d:ident),+)])? $name:ident($inner:ty) {$($k:ident: $v:ty),* $(,)?}) => {
9        $crate::builder!(@loop builder: $name, derive: [$($($d),+)?], inner: $inner {$($k: $v),*});
10    };
11    (@loop builder: $name:ident, derive: [$($d:ident),* $(,)?], inner: $inner:ty {$($k:ident: $v:ty),* $(,)?}) => {
12
13        #[derive(Default, $($d),*)]
14        pub struct $name {
15            inner: $inner,
16        }
17
18        $crate::builder!(@impl builder: $name, inner: $inner {$($k: $v),*});
19    };
20    (@impl builder: $name:ident, inner: $inner:ty {$($k:ident: $v:ty),* $(,)?}) => {
21        impl $name {
22            pub fn new() -> Self {
23                Self {
24                    inner: Default::default()
25                }
26            }
27
28            pub fn from_inner(inner: $inner) -> Self {
29                Self { inner }
30            }
31
32            pub fn build(self) -> $inner {
33                self.inner
34            }
35
36            $(
37                pub fn $k(mut self, $k: $v) -> Self {
38                    self.inner.$k = $k;
39                    self
40                }
41            )*
42        }
43    };
44}