scsys_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        builder!(@loop builder: $name, derive: [$($($d),+)?], inner: $inner {$($k: $v),*});
10    };
11    ($(#[derive($($d:ident),+)])? $name:ident($inner:ty) {$($k:ident: $v:ty),* $(,)?}) => {
12        builder!(@loop builder: $name, derive: [$($($d),+)?], inner: $inner {$($k: $v),*});
13    };
14    (@loop builder: $name:ident, derive: [$($d:ident),* $(,)?], inner: $inner:ty {$($k:ident: $v:ty),* $(,)?}) => {
15
16        #[derive(Default, $($d),*)]
17        pub struct $name {
18            inner: $inner,
19        }
20
21        builder!(@impl builder: $name, inner: $inner {$($k: $v),*});
22    };
23    (@impl builder: $name:ident, inner: $inner:ty {$($k:ident: $v:ty),* $(,)?}) => {
24        impl $name {
25            pub fn new() -> Self {
26                Self {
27                    inner: Default::default()
28                }
29            }
30
31            pub fn from_inner(inner: $inner) -> Self {
32                Self { inner }
33            }
34
35            pub fn build(self) -> $inner {
36                self.inner
37            }
38
39            $(
40                pub fn $k(mut self, $k: $v) -> Self {
41                    self.inner.$k = $k;
42                    self
43                }
44            )*
45        }
46    };
47}