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}