#[macro_export]
#[doc(hidden)]
macro_rules! Builder {
(() $($body:tt)*) => {
Builder! { $($body)* }
};
(
$(#[$ignore:meta])*
$(pub)* struct $($body:tt)*
) => {
Builder! { @parse $($body)* }
};
(
@impl_struct
struct_name = $struct_name:ident,
generics = ($($generics:ident),*),
fields = [$({
field_name: $field_name:ident,
field_ty: $field_ty:ty,
field_attr: [$($attr:tt)*],
})*],
) => {
#[allow(dead_code)]
impl<$($generics),*> $struct_name<$($generics),*> {
$(
Builder!( @impl_setter {
field_attr_raw: [$($attr)*],
field_attr_filtered: [],
field_name: $field_name,
field_ty: $field_ty,
});
)*
}
};
(
@parse
$struct_name:ident <$($generics:ident),*>
$body:tt $(;)*
) => {
__parse_struct_body! {
@parse
body = $body,
callback = Builder (
@impl_struct
struct_name = $struct_name,
generics = ($($generics),*),
)
}
};
(
@parse
$struct_name:ident
$body:tt $(;)*
) => {
__parse_struct_body! {
@parse
body = $body,
callback = Builder (
@impl_struct
struct_name = $struct_name,
generics = (),
)
}
};
( @impl_setter {
field_attr_raw: [],
field_attr_filtered: [$(#[$meta:meta])*],
field_name: $field_name:ident,
field_ty: $field_ty:ty,
}) => {
$(#[$meta])*
pub fn $field_name<VALUE: Into<$field_ty>>(&mut self, value: VALUE) -> &mut Self {
self.$field_name = value.into();
self
}
};
( @impl_setter {
field_attr_raw: [#[doc = $($doc:tt)*] $($attr_raw:tt)*],
field_attr_filtered: [$($attr_filtered:tt)*],
$($tail:tt)*
}) => {
Builder!( @impl_setter {
field_attr_raw: [$($attr_raw)*],
field_attr_filtered: [$($attr_filtered)* #[doc = $($doc)*]],
$($tail)*
});
};
( @impl_setter {
field_attr_raw: [#[allow($($allow:tt)*)] $($attr_raw:tt)*],
field_attr_filtered: [$($attr_filtered:tt)*],
$($tail:tt)*
}) => {
Builder!( @impl_setter {
field_attr_raw: [$($attr_raw)*],
field_attr_filtered: [$($attr_filtered)* #[allow($($allow)*)]],
$($tail)*
});
};
( @impl_setter {
field_attr_raw: [#[cfg($($cfg:tt)*)] $($attr_raw:tt)*],
field_attr_filtered: [$($attr_filtered:tt)*],
$($tail:tt)*
}) => {
Builder!( @impl_setter {
field_attr_raw: [$($attr_raw)*],
field_attr_filtered: [$($attr_filtered)* #[cfg($($cfg)*)]],
$($tail)*
});
};
( @impl_setter {
field_attr_raw: [#[$($ignore:tt)*] $($attr_raw:tt)*],
field_attr_filtered: [$($attr_filtered:tt)*],
$($tail:tt)*
}) => {
Builder!( @impl_setter {
field_attr_raw: [$($attr_raw)*],
field_attr_filtered: [$($attr_filtered)*],
$($tail)*
});
};
}