pub mod common;
pub mod config;
#[allow(clippy::module_inception)]
pub mod trace;
#[macro_export]
macro_rules! pb_enum {
(
$name:ident {
$( $entry:ident : $id:literal ),+ $(,)?
}
) => {
paste::paste! {
#[doc = concat!("Protobuf enum for `", stringify!($name), "`")]
#[allow(non_camel_case_types)]
#[repr(u32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum $name {
$(
#[doc = concat!("Variant for `", stringify!($entry), "`")]
[<$entry:camel>] = $id
),*
}
impl From<$name> for u32 {
#[inline]
fn from(v: $name) -> u32 { v as u32 }
}
impl TryFrom<u32> for $name {
type Error = ();
fn try_from(v: u32) -> Result<Self, Self::Error> {
match v {
$(
$id => Ok([<$name>]::[<$entry:camel>]),
)*
_ => Err(()),
}
}
}
}
};
}
#[macro_export]
macro_rules! pb_msg {
(
$name:ident {
}
) => {
paste::paste! {
#[doc = concat!("Protobuf message struct for `", stringify!($name), "`")]
#[allow(non_camel_case_types)]
pub struct $name<'a, 'b> {
#[doc = concat!("PbMsg for protobuf message `", stringify!($name), "`")]
pub msg: &'a mut $crate::pb_msg::PbMsg<'b>,
}
}
};
(
$name:ident {
$( $field:ident : $tp:tt, $kind:ident, $id:literal ),+ $(,)?
}
) => {
paste::paste! {
#[doc = concat!("Protobuf field numbers for `", stringify!($name), "`")]
#[repr(u32)]
pub enum [<$name:camel FieldNumber>] {
$(
#[doc = concat!("Field number for `", stringify!($field), "`")]
[<$field:camel>] = $id
),*
}
}
paste::paste! {
#[doc = concat!("Protobuf message struct for `", stringify!($name), "`")]
#[allow(non_camel_case_types)]
pub struct $name<'a, 'b> {
#[doc = concat!("PbMsg for protobuf message `", stringify!($name), "`")]
pub msg: &'a mut $crate::pb_msg::PbMsg<'b>,
}
}
impl<'a, 'b> $name<'a, 'b> {
$(
pb_msg!(@setter pub fn $name, $field, $id, $kind, $tp);
)*
}
};
(@decl $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, String) => {
paste::paste! {
#[doc = concat!("Set `", stringify!($field), "` field")]
$vis fn [<set_ $field>] (&mut self, value: impl Into<String>) -> &mut Self;
}
};
(@setter $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, String) => {
paste::paste! {
#[doc = concat!("Set `", stringify!($field), "` field")]
$vis fn [<set_ $field>] (&mut self, value: impl Into<String>) -> &mut Self {
let s: String = value.into();
self.msg.append_type2_field($id, s.as_bytes());
self
}
}
};
(@decl $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, String) => {
paste::paste! {
#[doc = concat!("Set `", stringify!($field), "` field")]
$vis fn [<set_ $field>] (&mut self, value: f32) -> &mut Self;
}
};
(@setter $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, f32) => {
paste::paste! {
#[doc = concat!("Set `", stringify!($field), "` field")]
$vis fn [<set_ $field>] (&mut self, value: f32) -> &mut Self {
self.msg.append_float_field($id, value);
self
}
}
};
(@decl $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, String) => {
paste::paste! {
#[doc = concat!("Set `", stringify!($field), "` field")]
$vis fn [<set_ $field>] (&mut self, value: f64) -> &mut Self;
}
};
(@setter $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, f64) => {
paste::paste! {
#[doc = concat!("Set `", stringify!($field), "` field")]
$vis fn [<set_ $field>] (&mut self, value: f64) -> &mut Self {
self.msg.append_double_field($id, value);
self
}
}
};
(@decl $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, u32) => {
pb_msg!(@varint_decl $vis fn $name, $field, $id, u32);
};
(@setter $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, u32) => {
pb_msg!(@varint_setter $vis fn $name, $field, $id, u32);
};
(@decl $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, u64) => {
pb_msg!(@varint_decl $vis fn $name, $field, $id, u64);
};
(@setter $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, u64) => {
pb_msg!(@varint_setter $vis fn $name, $field, $id, u64);
};
(@decl $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, i32) => {
pb_msg!(@varint_decl $vis fn $name, $field, $id, i32);
};
(@setter $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, i32) => {
pb_msg!(@varint_setter $vis fn $name, $field, $id, i32);
};
(@decl $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, i64) => {
pb_msg!(@varint_decl $vis fn $name, $field, $id, i64);
};
(@setter $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, i64) => {
pb_msg!(@varint_setter $vis fn $name, $field, $id, i64);
};
(@decl $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, bool) => {
pb_msg!(@varint_decl $vis fn $name, $field, $id, bool);
};
(@setter $vis:vis fn $name:ident, $field:ident, $id: literal, primitive, bool) => {
pb_msg!(@varint_setter $vis fn $name, $field, $id, bool);
};
(@varint_decl $vis:vis fn $name:ident, $field:ident, $id: literal, $tp:tt) => {
paste::paste! {
#[doc = concat!("Set `", stringify!($field), "` field")]
$vis fn [<set_ $field>] (&mut self, value: $tp) -> &mut Self;
}
};
(@varint_setter $vis:vis fn $name:ident, $field:ident, $id: literal, $tp:tt) => {
paste::paste! {
#[doc = concat!("Set `", stringify!($field), "` field")]
$vis fn [<set_ $field>] (&mut self, value: $tp) -> &mut Self {
self.msg.append_type0_field($id, value as u64);
self
}
}
};
(@decl $vis:vis fn $name:ident, $field:ident, $id: literal, enum, $tp:tt) => {
paste::paste! {
#[doc = concat!("Set `", stringify!($field), "` field")]
$vis fn [<set_ $field>] (&mut self, value: $tp) -> &mut Self;
}
};
(@setter $vis:vis fn $name:ident, $field:ident, $id: literal, enum, $tp:tt) => {
paste::paste! {
#[doc = concat!("Set `", stringify!($field), "` field")]
$vis fn [<set_ $field>] (&mut self, value: $tp) -> &mut Self {
self.msg.append_type0_field($id, value as u64);
self
}
}
};
(@decl $vis:vis fn $name:ident, $field:ident, $id: literal, msg, $tp:tt) => {
paste::paste! {
#[doc = concat!("Set `", stringify!($field), "` field")]
$vis fn [<set_ $field>] <F>(&mut self, cb: F) -> &mut Self
where
F: for<'p> Fn(&'p mut $tp);
}
};
(@setter $vis:vis fn $name:ident, $field:ident, $id: literal, msg, $tp:tt) => {
paste::paste! {
#[doc = concat!("Set `", stringify!($field), "` field")]
$vis fn [<set_ $field>] <F>(&mut self, cb: F) -> &mut Self
where
F: for<'p> Fn(&'p mut $tp),
{
self.msg.append_nested($id, |nested_msg| {
let mut msg_field: $tp<'_, '_> = $tp {
msg: nested_msg,
};
cb(&mut msg_field);
});
self
}
}
};
}
#[macro_export]
macro_rules! pb_msg_ext {
(
$name:ident {
$( $field:ident : $tp:tt, $kind:ident, $id:literal ),+ $(,)?
}
) => {
paste::paste! {
#[doc = concat!("Protobuf extra field numbers for `", stringify!($name), "`")]
#[repr(u32)]
pub enum [<$name:camel ExtFieldNumber>] {
$(
#[doc = concat!("Field number for `", stringify!($field), "`")]
[<$field:camel>] = $id
),*
}
}
paste::paste! {
#[doc = concat!("Protobuf extra message trait for `", stringify!($name), "`")]
#[allow(non_camel_case_types)]
pub trait [<$name Ext>]<'a, 'b> {
$(
pb_msg!(@decl fn $name, $field, $id, $kind, $tp);
)*
}
impl<'a, 'b> [<$name Ext>]<'_, '_> for $name<'a, 'b> {
$(
pb_msg!(@setter fn $name, $field, $id, $kind, $tp);
)*
}
}
};
}