#[macro_export]
macro_rules! proto_enum {
($enum:expr, $($tokens:tt)*) => {
$crate::proto_enum_impl! {
@builder($enum),
@options(),
@reserved(),
@reserved_names(),
@variants(),
@included_variants(),
@rest($($tokens)*)
}
};
}
#[macro_export]
macro_rules! enum_variants {
($(imports = $imports:expr,)? $($number:literal => $name:literal $({ $options:expr })?),+ $(,)? ) => {
$crate::enums::ReusableVariants::builder()
.variants(
Box::new([ $(($number, $crate::enums::EnumVariant::builder()
.name($name)
$(.options($options))?
.build()
)),* ])
)
$(.imports($imports))?
.build()
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! proto_enum_impl {
(
@builder($enum:expr),
@options($($options:expr)?),
@reserved($($reserved:tt)*),
@reserved_names($($reserved_names:expr)?),
@variants($($variants:tt)*),
@included_variants($($included_variants:expr,)*),
@rest($(,)?)
) => {
{
let mut variants = vec! [ $($variants)* ];
let included_variants: Vec<$crate::enums::ReusableVariants> = vec! [ $($included_variants),* ];
let mut temp_enum1 = $enum;
if !included_variants.is_empty() {
for group in included_variants.into_iter() {
variants.extend(group.variants);
temp_enum1 = temp_enum1.add_imports(group.imports);
}
}
let temp_enum2 = temp_enum1
$(
.options($options)
)?
$(
.reserved_names($reserved_names)
)?
.variants(
variants
);
$crate::parse_reserved!{
@builder(temp_enum2)
@ranges()
@numbers()
@rest($($reserved)*)
}
}
};
(
@builder($enum:expr),
@options($($options:tt)*),
@reserved($($reserved:tt)*),
@reserved_names($($reserved_names:tt)*),
@variants($($variants:tt)*),
@included_variants($($included_variants:tt)*),
@rest($(,)? include($variants_block:expr) $($rest:tt)*)
) => {
$crate::proto_enum_impl! {
@builder($enum),
@options($($options)*),
@reserved($($reserved)*),
@reserved_names($($reserved_names)*),
@variants($($variants)*),
@included_variants($($included_variants)* $variants_block.clone(),),
@rest($($rest)*)
}
};
(
@builder($enum:expr),
@options(),
@reserved($($reserved:tt)*),
@reserved_names($($reserved_names:tt)*),
@variants($($variants:tt)*),
@included_variants($($included_variants:tt)*),
@rest($(,)? options = $options_expr:expr, $($rest:tt)* )
) => {
$crate::proto_enum_impl! {
@builder($enum),
@options($options_expr),
@reserved($($reserved)*),
@reserved_names($($reserved_names)*),
@variants($($variants)*),
@included_variants($($included_variants)*),
@rest($($rest)*)
}
};
(
@builder($enum:expr),
@options($($options:tt)*),
@reserved(),
@reserved_names($($reserved_names:tt)*),
@variants($($variants:tt)*),
@included_variants($($included_variants:tt)*),
@rest($(,)? reserved = [ $($items:tt)* ] $($rest:tt)*)
) => {
$crate::proto_enum_impl! {
@builder($enum),
@options($($options)*),
@reserved($($items)*),
@reserved_names($($reserved_names)*),
@variants($($variants)*),
@included_variants($($included_variants)*),
@rest($($rest)*)
}
};
(
@builder($enum:expr),
@options($($options:tt)*),
@reserved($($reserved:tt)*),
@reserved_names(),
@variants($($variants:tt)*),
@included_variants($($included_variants:tt)*),
@rest($(,)? reserved_names = $reserved_names:expr, $($rest:tt)*)
) => {
$crate::proto_enum_impl! {
@builder($enum),
@options($($options)*),
@reserved($($reserved)*),
@reserved_names($reserved_names),
@variants($($variants)*),
@included_variants($($included_variants)*),
@rest($($rest)*)
}
};
(
@builder($enum:expr),
@options($($options:tt)?),
@reserved($($reserved:tt)*),
@reserved_names($($reserved_names:tt)*),
@variants($($variants:tt)*),
@included_variants($($included_variants:tt)*),
@rest($(,)? $tag:literal => $variant:literal $({ $enum_value_options:expr })?, $($rest:tt)*)
) => {
$crate::proto_enum_impl! {
@builder($enum),
@options($($options)*),
@reserved($($reserved)*),
@reserved_names($($reserved_names)*),
@variants($($variants)*
($tag, $crate::enums::EnumVariant::builder().name($variant)
$(.options($enum_value_options))?
.build()
),),
@included_variants($($included_variants)*),
@rest($($rest)*)
}
};
(
@builder($enum:expr),
@options($($options:tt)?),
@reserved($($reserved:tt)*),
@reserved_names($($reserved_names:tt)*),
@variants($($variants:tt)*),
@included_variants($($included_variants:tt)*),
@rest($(,)? $tag:literal => $variant:literal $({ $enum_value_options:expr })?)
) => {
$crate::proto_enum_impl! {
@builder($enum),
@options($($options)*),
@reserved($($reserved)*),
@reserved_names($($reserved_names)*),
@variants($($variants)* ($tag, $crate::enums::EnumVariant::builder()
.name($variant)
$(.options($enum_value_options))?
.build()
)),
@included_variants($($included_variants)*),
@rest()
}
};
}