1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
use bitbuffer::BitRead; use num_enum::TryFromPrimitive; use crate::{Parse, ParserState, Result, Stream}; use self::consolecmd::ConsoleCmdPacket; use self::datatable::DataTablePacket; use self::message::MessagePacket; use self::stop::StopPacket; use self::stringtable::StringTablePacket; use self::synctick::SyncTickPacket; use self::usercmd::UserCmdPacket; pub mod consolecmd; pub mod datatable; pub mod message; pub mod stop; pub mod stringtable; pub mod synctick; pub mod usercmd; #[derive(Debug)] pub enum Packet<'a> { Sigon(MessagePacket<'a>), Message(MessagePacket<'a>), SyncTick(SyncTickPacket), ConsoleCmd(ConsoleCmdPacket), UserCmd(UserCmdPacket), DataTables(DataTablePacket), Stop(StopPacket), StringTables(StringTablePacket<'a>), } #[derive(BitRead, TryFromPrimitive, Debug, Clone, Copy)] #[discriminant_bits = 8] #[repr(u8)] pub enum PacketType { Sigon = 1, Message = 2, SyncTick = 3, ConsoleCmd = 4, UserCmd = 5, DataTables = 6, Stop = 7, StringTables = 8, } impl<'a> Parse<'a> for Packet<'a> { fn parse(stream: &mut Stream<'a>, state: &ParserState) -> Result<Self> { let packet_type = PacketType::read(stream)?; Ok(match packet_type { PacketType::Sigon => Packet::Sigon(MessagePacket::parse(stream, state)?), PacketType::Message => Packet::Message(MessagePacket::parse(stream, state)?), PacketType::SyncTick => Packet::SyncTick(SyncTickPacket::parse(stream, state)?), PacketType::ConsoleCmd => Packet::ConsoleCmd(ConsoleCmdPacket::parse(stream, state)?), PacketType::UserCmd => Packet::UserCmd(UserCmdPacket::parse(stream, state)?), PacketType::DataTables => Packet::DataTables(DataTablePacket::parse(stream, state)?), PacketType::Stop => Packet::Stop(StopPacket::parse(stream, state)?), PacketType::StringTables => { Packet::StringTables(StringTablePacket::parse(stream, state)?) } }) } }