tf_demo_parser/
lib.rs

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