tf_demo_parser/
lib.rs

1#![cfg_attr(not(test), deny(clippy::unwrap_used))]
2#![cfg_attr(not(test), deny(clippy::expect_used))]
3#![cfg_attr(not(test), deny(clippy::indexing_slicing))]
4#![cfg_attr(not(test), deny(clippy::panic))]
5
6pub use bitbuffer::Result as ReadResult;
7
8pub use crate::demo::{
9    message::MessageType,
10    parser::{
11        DemoParser, GameEventError, MatchState, MessageTypeAnalyser, Parse, ParseError,
12        ParserState, Result,
13    },
14    Demo, Stream,
15};
16
17#[cfg(feature = "codegen")]
18pub mod codegen;
19pub(crate) mod consthash;
20pub mod demo;
21pub(crate) mod nullhasher;
22
23#[cfg(test)]
24#[track_caller]
25fn test_roundtrip_write<
26    'a,
27    T: bitbuffer::BitRead<'a, bitbuffer::LittleEndian>
28        + bitbuffer::BitWrite<bitbuffer::LittleEndian>
29        + std::fmt::Debug
30        + std::cmp::PartialEq,
31>(
32    val: T,
33) {
34    let mut data = Vec::with_capacity(128);
35    use bitbuffer::{BitReadBuffer, BitReadStream, BitWriteStream, LittleEndian};
36    let pos = {
37        let mut stream = BitWriteStream::new(&mut data, LittleEndian);
38        val.write(&mut stream).unwrap();
39        stream.bit_len()
40    };
41
42    let mut read = BitReadStream::new(BitReadBuffer::new_owned(data, LittleEndian));
43    assert_eq!(
44        val,
45        read.read().unwrap(),
46        "Failed to assert the parsed message is equal to the original"
47    );
48    assert_eq!(
49        pos,
50        read.pos(),
51        "Failed to assert that all encoded bits ({}) are used for decoding ({})",
52        pos,
53        read.pos()
54    );
55}
56
57#[cfg(test)]
58#[track_caller]
59fn test_roundtrip_encode<
60    'a,
61    T: Parse<'a> + crate::demo::parser::Encode + std::fmt::Debug + std::cmp::PartialEq,
62>(
63    val: T,
64    state: &ParserState,
65) {
66    let mut data = Vec::with_capacity(128);
67    use bitbuffer::{BitReadBuffer, BitReadStream, BitWriteStream, LittleEndian};
68    let pos = {
69        let mut stream = BitWriteStream::new(&mut data, LittleEndian);
70        val.encode(&mut stream, state).unwrap();
71        stream.bit_len()
72    };
73
74    let mut read = BitReadStream::new(BitReadBuffer::new_owned(data, LittleEndian));
75    pretty_assertions::assert_eq!(
76        val,
77        T::parse(&mut read, state).unwrap(),
78        "Failed to assert the parsed message is equal to the original"
79    );
80    pretty_assertions::assert_eq!(
81        pos,
82        read.pos(),
83        "Failed to assert that all encoded bits ({}) are used for decoding ({})",
84        pos,
85        read.pos()
86    );
87}