Skip to main content

tf_demo_parser/demo/message/
setconvar.rs

1use bitbuffer::{BitRead, BitReadStream, Endianness};
2#[cfg(feature = "write")]
3use bitbuffer::{BitWrite, BitWriteStream};
4use serde::{Deserialize, Serialize};
5
6use crate::ReadResult;
7
8#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
9#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
10#[cfg_attr(feature = "write", derive(BitWrite))]
11pub struct ConVar {
12    pub key: String,
13    pub value: String,
14}
15
16impl<E: Endianness> BitRead<'_, E> for ConVar {
17    fn read(stream: &mut BitReadStream<'_, E>) -> ReadResult<Self> {
18        let key = stream
19            .read()
20            .unwrap_or_else(|_| "Malformed cvar name".to_string());
21        let value = stream
22            .read()
23            .unwrap_or_else(|_| "Malformed cvar value".to_string());
24        Ok(ConVar { key, value })
25    }
26}
27
28#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
29#[derive(Debug, BitRead, PartialEq, Serialize, Deserialize, Clone)]
30pub struct SetConVarMessage {
31    pub length: u8,
32    #[size = "length"]
33    pub vars: Vec<ConVar>,
34}
35
36#[cfg(feature = "write")]
37impl<E: Endianness> BitWrite<E> for SetConVarMessage {
38    fn write(&self, stream: &mut BitWriteStream<E>) -> ReadResult<()> {
39        self.length.write(stream)?;
40        self.vars.write(stream)
41    }
42}
43#[test]
44#[cfg(feature = "write")]
45fn test_set_con_var_roundtrip() {
46    crate::test_roundtrip_write(SetConVarMessage {
47        length: 0,
48        vars: Vec::new(),
49    });
50    crate::test_roundtrip_write(SetConVarMessage {
51        length: 2,
52        vars: vec![
53            ConVar {
54                key: "foo1".to_string(),
55                value: "bar1".to_string(),
56            },
57            ConVar {
58                key: "foo2".to_string(),
59                value: "bar2".to_string(),
60            },
61        ],
62    });
63}