Skip to main content

proto_packet/io/macros/
impl_enum_encode.rs

1/// Implements `EncodedLen`, `EncodeToSlice`, and `EncodeToWrite` for an enum type.
2///
3/// The enum must implement `proto_packet::io::WithTagNumber`.
4#[macro_export]
5macro_rules! impl_enum_encode {
6    ($enum_type:ty) => {
7        impl enc::EncodedLen for $enum_type {
8            fn encoded_len(&self) -> Result<usize, enc::Error> {
9                use $crate::io::WithTagNumber;
10                enc::var_int::VarInt32::from(self.tag().value()).encoded_len()
11            }
12        }
13
14        impl enc::EncodeToSlice for $enum_type {
15            unsafe fn encode_to_slice_unchecked(
16                &self,
17                target: &mut [u8],
18            ) -> Result<usize, enc::Error> {
19                use $crate::io::WithTagNumber;
20                unsafe {
21                    enc::var_int::VarInt32::from(self.tag().value())
22                        .encode_to_slice_unchecked(target)
23                }
24            }
25        }
26
27        enc::impl_encode_to_write_stack_buf!($enum_type, enc::var_int::VarInt32::MAX_ENCODED_LEN);
28    };
29}