mod enums_macros;
mod extensions_macros;
mod fields_macros;
mod maps_macros;
mod oneofs_macros;
mod options_macros;
mod parse_reserved;
mod services_macros;
#[macro_export]
macro_rules! cel_rule {
(id = $id:expr, msg = $msg:expr, expr = $expr:expr) => {
$crate::validators::cel::CelRule {
id: $id.into(),
message: $msg.into(),
expression: $expr.into(),
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! cel_rules {
(
@rules($($rules:tt)*)
@rest($(,)?)
) => {
[ $($rules)* ]
};
(
@rules($($rules:tt)*)
@rest({ $($rule_tokens:tt)* } $($rest:tt)*)
) => {
$crate::cel_rules!(
@rules($($rules)* $crate::cel_rule!($($rule_tokens)*),)
@rest($($rest)*)
)
};
}
#[macro_export]
macro_rules! message {
($msg_builder:expr, options = $options:expr, $($tokens:tt)*) => {
$crate::_internal_message_body! {
@builder($msg_builder)
@fields()
@fields_blocks()
@oneofs()
@enums()
@reserved()
@reserved_names()
@cel()
@input($($tokens)*)
}.add_options($options)
};
($msg_builder:expr, $($tokens:tt)*) => {
$crate::_internal_message_body! {
@builder($msg_builder)
@fields()
@fields_blocks()
@oneofs()
@enums()
@reserved()
@reserved_names()
@cel()
@input($($tokens)*)
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! _internal_message_body {
(
@builder($builder:expr)
@fields($($fields:tt)*)
@fields_blocks($($fields_blocks:expr,)*)
@oneofs($($oneofs:tt)*)
@enums($($enums:tt)*)
@reserved($($reserved:tt)*)
@reserved_names($($names:expr)?)
@cel($($cel_rules:expr)?)
@input($(,)?)
) => {
{
{ $($enums)* };
let mut fields_list = vec! [ $($fields)* ];
$(fields_list.extend($fields_blocks));*;
let oneofs_list = [ $($oneofs)* ];
let mut new_msg = $builder
.fields(fields_list)
.add_oneofs(oneofs_list)
$(
.cel_rules($cel_rules)
)?
$(
.reserved_names($names)
)?;
$crate::parse_reserved! {
@builder(new_msg)
@ranges()
@numbers()
@rest($($reserved)*)
}
}
};
(
@builder($builder:expr)
@fields($($fields:tt)*)
@fields_blocks($($fields_blocks:tt)*)
@oneofs($($oneofs:tt)*)
@enums($($enums:tt)*)
@reserved($($reserved:tt)*)
@reserved_names($($reserved_names:tt)*)
@cel($($cel:tt)*)
@input($(,)? include_oneof($oneof:expr) $($rest:tt)*)
) => {
$crate::_internal_message_body! {
@builder($builder)
@fields($($fields)*)
@fields_blocks($($fields_blocks)*)
@oneofs($($oneofs)* $oneof.clone(),)
@enums($($enums)*)
@reserved($($reserved)*)
@reserved_names($($reserved_names)*)
@cel($($cel)*)
@input($($rest)*)
}
};
(
@builder($builder:expr)
@fields($($fields:tt)*)
@fields_blocks($($fields_blocks:tt)*)
@oneofs($($oneofs:tt)*)
@enums($($enums:tt)*)
@reserved($($reserved:tt)*)
@reserved_names($($reserved_names:tt)*)
@cel($($cel:tt)*)
@input($(,)? include($block:expr) $($rest:tt)*)
) => {
$crate::_internal_message_body! {
@builder($builder)
@fields($($fields)*)
@fields_blocks($($fields_blocks)* $block.clone(),)
@oneofs($($oneofs)*)
@enums($($enums)*)
@reserved($($reserved)*)
@reserved_names($($reserved_names)*)
@cel($($cel)*)
@input($($rest)*)
}
};
(
@builder($builder:expr)
@fields($($fields:tt)*)
@fields_blocks($($fields_blocks:tt)*)
@oneofs($($oneofs:tt)*)
@enums($($enums:tt)*)
@reserved($($reserved:tt)*)
@reserved_names($($reserved_names:tt)*)
@cel()
@input($(,)? cel = [ $($items:tt)* ] $($rest:tt)*)
) => {
$crate::_internal_message_body! {
@builder($builder)
@fields($($fields)*)
@fields_blocks($($fields_blocks)*)
@oneofs($($oneofs)*)
@enums($($enums)*)
@reserved($($reserved)*)
@reserved_names($($reserved_names)*)
@cel($crate::cel_rules!(
@rules()
@rest($($items)*)
))
@input($($rest)*)
}
};
(
@builder($builder:expr)
@fields($($fields:tt)*)
@fields_blocks($($fields_blocks:tt)*)
@oneofs($($oneofs:tt)*)
@enums($($enums:tt)*)
@reserved()
@reserved_names($($reserved_names:tt)*)
@cel($($cel:tt)*)
@input($(,)? reserved = [ $($items:tt)* ] $($rest:tt)*)
) => {
$crate::_internal_message_body! {
@builder($builder)
@fields($($fields)*)
@fields_blocks($($fields_blocks)*)
@oneofs($($oneofs)*)
@enums($($enums)*)
@reserved($($items)*)
@reserved_names($($reserved_names)*)
@cel($($cel)*)
@input($($rest)*)
}
};
(
@builder($builder:expr)
@fields($($fields:tt)*)
@fields_blocks($($fields_blocks:tt)*)
@oneofs($($oneofs:tt)*)
@enums($($enums:tt)*)
@reserved($($reserved:tt)*)
@reserved_names()
@cel($($cel:tt)*)
@input($(,)? reserved_names = $reserved_names:expr, $($rest:tt)*)
) => {
$crate::_internal_message_body! {
@builder($builder)
@fields($($fields)*)
@fields_blocks($($fields_blocks)*)
@oneofs($($oneofs)*)
@enums($($enums)*)
@reserved($($reserved)*)
@reserved_names($reserved_names)
@cel($($cel)*)
@input($($rest)*)
}
};
(
@builder($builder:expr)
@fields($($fields:tt)*)
@fields_blocks($($fields_blocks:tt)*)
@oneofs($($oneofs:tt)*)
@enums($($enums:tt)*)
@reserved($($reserved:tt)*)
@reserved_names($($reserved_names:tt)*)
@cel($($cel:tt)*)
@input($(,)? enum $name:literal { $($tokens:tt)* } $($rest:tt)* )
) => {
$crate::_internal_message_body! {
@builder($builder)
@fields($($fields)*)
@fields_blocks($($fields_blocks)*)
@oneofs($($oneofs)*)
@enums($crate::proto_enum!($builder.new_enum($name), $($tokens)*); $($enums)*)
@reserved($($reserved)*)
@reserved_names($($reserved_names)*)
@cel($($cel)*)
@input($($rest)*)
}
};
(
@builder($builder:expr)
@fields($($fields:tt)*)
@fields_blocks($($fields_blocks:tt)*)
@oneofs($($oneofs:tt)*)
@enums($($enums:tt)*)
@reserved($($reserved:tt)*)
@reserved_names($($reserved_names:tt)*)
@cel($($cel:tt)*)
@input($(,)? oneof $name:literal { $($oneof_body:tt)* } $($rest:tt)* )
) => {
$crate::_internal_message_body! {
@builder($builder)
@fields($($fields)*)
@fields_blocks($($fields_blocks)*)
@oneofs(
$($oneofs)*
$crate::oneof!($name, $($oneof_body)*),
)
@enums($($enums)*)
@reserved($($reserved)*)
@reserved_names($($reserved_names)*)
@cel($($cel)*)
@input($($rest)*)
}
};
(
@builder($builder:expr)
@fields($($fields:tt)*)
@fields_blocks($($fields_blocks:tt)*)
@oneofs($($oneofs:tt)*)
@enums($($enums:tt)*)
@reserved($($reserved:tt)*)
@reserved_names($($reserved_names:tt)*)
@cel($($cel:tt)*)
@input($(,)? $tag:literal => $field:expr, $($rest:tt)* )
) => {
$crate::_internal_message_body! {
@builder($builder)
@fields($($fields)* ($tag, $field),)
@fields_blocks($($fields_blocks)*)
@oneofs($($oneofs)*)
@enums($($enums)*)
@reserved($($reserved)*)
@reserved_names($($reserved_names)*)
@cel($($cel)*)
@input($($rest)*)
}
};
(
@builder($builder:expr)
@fields($($fields:tt)*)
@fields_blocks($($fields_blocks:tt)*)
@oneofs($($oneofs:tt)*)
@enums($($enums:tt)*)
@reserved($($reserved:tt)*)
@reserved_names($($reserved_names:tt)*)
@cel($($cel:tt)*)
@input($(,)? $tag:literal => $field:expr)
) => {
$crate::_internal_message_body! {
@builder($builder)
@fields($($fields)* ($tag, $field))
@fields_blocks($($fields_blocks)*)
@oneofs($($oneofs)*)
@enums($($enums)*)
@reserved($($reserved)*)
@reserved_names($($reserved_names)*)
@cel($($cel)*)
@input()
}
};
}