concision_core/macros/
builder.rs1#[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}