From 67d33f64c0668facac0a00353dbc555855d10056 Mon Sep 17 00:00:00 2001 From: Lol3rrr Date: Sun, 22 Sep 2024 20:31:38 +0200 Subject: [PATCH] Fix formatting and minor restructuring Fixed formatting using cargo fmt. Change some parser structure to reduce code deduplication --- examples/ancient-entity.rs | 6 ++- examples/ancient-noentity.rs | 6 ++- src/frame.rs | 15 ++++-- src/parser.rs | 101 +++++++++-------------------------- src/parser/entities.rs | 4 +- src/parser/propcontroller.rs | 11 ++-- 6 files changed, 53 insertions(+), 90 deletions(-) diff --git a/examples/ancient-entity.rs b/examples/ancient-entity.rs index 351f026..3643033 100644 --- a/examples/ancient-entity.rs +++ b/examples/ancient-entity.rs @@ -3,7 +3,11 @@ const DATA: &[u8] = include_bytes!("../testfiles/de_ancient.dem"); fn main() { let container = csdemo::Container::parse(DATA).unwrap(); - let output = csdemo::parser::parse(csdemo::FrameIterator::parse(container.inner), csdemo::parser::EntityFilter::all()).unwrap(); + let output = csdemo::parser::parse( + csdemo::FrameIterator::parse(container.inner), + csdemo::parser::EntityFilter::all(), + ) + .unwrap(); println!("Header: {:?}", output.header); println!("Players: {:?}", output.player_info); diff --git a/examples/ancient-noentity.rs b/examples/ancient-noentity.rs index 2778073..e9d404b 100644 --- a/examples/ancient-noentity.rs +++ b/examples/ancient-noentity.rs @@ -3,7 +3,11 @@ const DATA: &[u8] = include_bytes!("../testfiles/de_ancient.dem"); fn main() { let container = csdemo::Container::parse(DATA).unwrap(); - let output = csdemo::parser::parse(csdemo::FrameIterator::parse(container.inner), csdemo::parser::EntityFilter::disabled()).unwrap(); + let output = csdemo::parser::parse( + csdemo::FrameIterator::parse(container.inner), + csdemo::parser::EntityFilter::disabled(), + ) + .unwrap(); println!("Header: {:?}", output.header); println!("Players: {:?}", output.player_info); diff --git a/src/frame.rs b/src/frame.rs index 9895aa9..14f4654 100644 --- a/src/frame.rs +++ b/src/frame.rs @@ -39,7 +39,10 @@ impl<'b> Frame<'b> { Some(self.inner.as_ref()) } - pub fn decompress_with_buf<'s, 'buf>(&'s self, buf: &'b mut Vec) -> Result<&'buf [u8], ()> where 's: 'buf { + pub fn decompress_with_buf<'s, 'buf>(&'s self, buf: &'b mut Vec) -> Result<&'buf [u8], ()> + where + 's: 'buf, + { if !self.compressed { return Ok(&self.inner); } @@ -50,10 +53,12 @@ impl<'b> Frame<'b> { })?; buf.resize(uncompressed_len, 0); - snap::raw::Decoder::new().decompress(&self.inner, buf.as_mut_slice()).map_err(|e| { - println!("Decompressing"); - () - })?; + snap::raw::Decoder::new() + .decompress(&self.inner, buf.as_mut_slice()) + .map_err(|e| { + println!("Decompressing"); + () + })?; Ok(buf.as_slice()) } diff --git a/src/parser.rs b/src/parser.rs index 43b7a08..97a84f1 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -109,7 +109,9 @@ where let mut buffer = Vec::new(); for frame in frames.into_iter() { - let data = frame.decompress_with_buf(&mut buffer).map_err(|e| FirstPassError::DecompressFrame)?; + let data = frame + .decompress_with_buf(&mut buffer) + .map_err(|e| FirstPassError::DecompressFrame)?; match frame.cmd { DemoCommand::FileHeader => { @@ -121,8 +123,10 @@ where file_info = Some(raw); } DemoCommand::SignonPacket | DemoCommand::Packet => { - parse_packet( - data, + let raw: crate::csgo_proto::CDemoPacket = prost::Message::decode(data)?; + + inner_parse_packet( + &raw, &mut events, &mut event_mapping, &mut player_info, @@ -135,18 +139,22 @@ where )?; } DemoCommand::FullPacket => { - parse_fullpacket( - data, - &mut events, - &mut event_mapping, - &mut player_info, - &mut entity_ctx, - &mut paths, - &mut qf_mapper, - &mut baselines, - &prop_controller, - &mut entity_states, - )?; + let packet = parse_fullpacket(data)?; + + if let Some(packet) = packet { + inner_parse_packet( + &packet, + &mut events, + &mut event_mapping, + &mut player_info, + &mut entity_ctx, + &mut paths, + &mut qf_mapper, + &mut baselines, + &prop_controller, + &mut entity_states, + )?; + } } // TODO DemoCommand::AnimationData => {} @@ -222,18 +230,7 @@ where }) } -fn parse_fullpacket( - data: &[u8], - events: &mut Vec, - event_mapper: &mut GameEventMapping, - player_info: &mut std::collections::HashMap, - entity_ctx: &mut entities::EntityContext, - paths: &mut Paths, - qf_mapper: &mut decoder::QfMapper, - baselines: &mut std::collections::HashMap>, - prop_controller: &propcontroller::PropController, - entity_states: &mut Vec, -) -> Result<(), FirstPassError> { +fn parse_fullpacket(data: &[u8]) -> Result, FirstPassError> { let raw: crate::csgo_proto::CDemoFullPacket = prost::Message::decode(data)?; // TODO @@ -242,55 +239,7 @@ fn parse_fullpacket( // dbg!(&item.table_name); } - match raw.packet { - Some(packet) => { - inner_parse_packet( - &packet, - events, - event_mapper, - player_info, - entity_ctx, - paths, - qf_mapper, - baselines, - prop_controller, - entity_states, - )?; - - Ok(()) - } - None => Ok(()), - } -} - -fn parse_packet( - data: &[u8], - events: &mut Vec, - event_mapper: &mut GameEventMapping, - player_info: &mut std::collections::HashMap, - entity_ctx: &mut entities::EntityContext, - paths: &mut Paths, - qf_mapper: &mut decoder::QfMapper, - baselines: &mut std::collections::HashMap>, - prop_controller: &propcontroller::PropController, - entity_states: &mut Vec, -) -> Result<(), FirstPassError> { - let raw: crate::csgo_proto::CDemoPacket = prost::Message::decode(data)?; - - inner_parse_packet( - &raw, - events, - event_mapper, - player_info, - entity_ctx, - paths, - qf_mapper, - baselines, - prop_controller, - entity_states, - )?; - - Ok(()) + Ok(raw.packet) } fn inner_parse_packet( diff --git a/src/parser/entities.rs b/src/parser/entities.rs index d23fc5c..23aa2a5 100644 --- a/src/parser/entities.rs +++ b/src/parser/entities.rs @@ -83,9 +83,7 @@ impl EntityContext { let result = decoder.decode(bitreader, qf_mapper)?; if let Some(fi) = field_info { - if let Some(prop_info) = prop_controller - .prop_infos.get(&fi.prop_id) - { + if let Some(prop_info) = prop_controller.prop_infos.get(&fi.prop_id) { fields.push(EntityProp { field_info: fi, prop_info: prop_info.clone(), diff --git a/src/parser/propcontroller.rs b/src/parser/propcontroller.rs index c9697dd..593cdbb 100644 --- a/src/parser/propcontroller.rs +++ b/src/parser/propcontroller.rs @@ -271,10 +271,13 @@ impl PropController { } fn insert_propinfo(&mut self, prop_name: &str, f: &mut ValueField) { - self.prop_infos.insert(f.prop_id, PropInfo { - id: f.prop_id as u32, - prop_name: prop_name.into(), - }); + self.prop_infos.insert( + f.prop_id, + PropInfo { + id: f.prop_id as u32, + prop_name: prop_name.into(), + }, + ); } pub fn set_special_ids(&mut self, weap_prop: &str, is_grenade_or_weapon: bool, id: u32) {