Skip to main content

proto_packet/io/macros/
impl_enum_decode.rs

1/// Implements `DecodeFromReadPrefix` and `DecodeFromRead` for an enum type.
2///
3/// The enum must implement `From<proto_packet::io::TagNumber>`.
4#[macro_export]
5macro_rules! impl_enum_decode {
6    ($enum_type:ty) => {
7        impl enc::DecodeFromReadPrefix for $enum_type {
8            fn decode_from_read_prefix_with_first_byte<R>(
9                r: &mut R,
10                first: u8,
11            ) -> Result<Self, enc::Error>
12            where
13                R: std::io::Read,
14            {
15                let value: u32 =
16                    enc::var_int::VarInt32::decode_from_read_prefix_with_first_byte(r, first)?
17                        .value();
18                let tag: $crate::io::TagNumber = $crate::io::TagNumber::new(value)
19                    .ok_or(enc::Error::InvalidEncodedData { reason: None })?;
20                Ok(<$enum_type>::from(tag))
21            }
22        }
23
24        enc::impl_decode_from_read_by_prefix!($enum_type);
25    };
26}