wotbreplay_parser/models/data/
entity_method.rs

1//! Structures for «entity method» call packets.
2
3use byteorder::{LittleEndian, ReadBytesExt};
4use prost::encoding::decode_varint;
5use prost::Message;
6use serde::Serialize;
7use serde_with::serde_as;
8
9use self::update_arena::UpdateArena;
10use crate::models::data::read_quirky_length;
11use crate::result::Result;
12
13pub mod update_arena;
14
15#[serde_as]
16#[derive(Debug, Serialize)]
17pub enum EntityMethod {
18    /// Subtype 47.
19    UpdateArena {
20        field_number: u64,
21        arguments: UpdateArena,
22    },
23
24    /// Default variant when subtype is not known by the parser.
25    Unknown { sub_type: u32 },
26}
27
28impl EntityMethod {
29    /// Parse the entity method raw payload.
30    pub fn new(raw_payload: &[u8]) -> Result<Self> {
31        let mut raw_payload = raw_payload;
32
33        raw_payload.read_u32::<LittleEndian>()?;
34        let sub_type = raw_payload.read_u32::<LittleEndian>()?;
35
36        let this = match sub_type {
37            47 => {
38                let _inner_length = raw_payload.read_u32::<LittleEndian>()?;
39
40                let field_number = decode_varint(&mut raw_payload)?;
41                let message_length = read_quirky_length(&mut raw_payload)?;
42                Self::UpdateArena {
43                    field_number,
44                    arguments: UpdateArena::decode(&raw_payload[..message_length])?,
45                }
46            }
47
48            _ => Self::Unknown { sub_type },
49        };
50        Ok(this)
51    }
52}