source2_demo/
display.rs

1use crate::entity::field::*;
2use crate::entity::*;
3use crate::event::*;
4use crate::parser::Context;
5use crate::string_table::*;
6use prettytable::{row, Table};
7use std::fmt::{Display, Formatter};
8
9impl Display for Classes {
10    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
11        let mut table = Table::new();
12        table.add_row(row!["id", "name"]);
13        for class in self.classes_vec.iter() {
14            table.add_row(row![class.id().to_string(), class.name]);
15        }
16        write!(f, "{}", table)
17    }
18}
19
20impl Display for FieldPath {
21    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
22        for i in 0..=self.last {
23            write!(f, "{}", self.path[i])?;
24            if i != self.last {
25                write!(f, "/")?;
26            }
27        }
28        Ok(())
29    }
30}
31
32impl Display for StringTables {
33    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
34        let mut table = Table::new();
35        table.add_row(row!["id", "name", "rows"]);
36        for string_table in self.iter() {
37            table.add_row(row![
38                string_table.index.to_string(),
39                string_table.name,
40                string_table.items.len()
41            ]);
42        }
43        write!(f, "{}", table)
44    }
45}
46
47impl Display for StringTable {
48    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
49        let mut table = Table::new();
50        table.add_row(row!["idx", "key", "value"]);
51        for entry in self.items.iter() {
52            table.add_row(row![
53                entry.index,
54                entry.key,
55                format!(
56                    "{:?}...",
57                    entry
58                        .value
59                        .as_ref()
60                        .map(|x| if x.len() > 10 { &x[..10] } else { &x[..] })
61                )
62            ]);
63        }
64        write!(f, "{}", table)
65    }
66}
67
68impl Display for Context {
69    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
70        let mut table = Table::new();
71        table.add_row(row!["Classes", self.classes.classes_vec.len()]);
72        table.add_row(row![
73            "Entities",
74            self.entities
75                .entities_vec
76                .iter()
77                .filter(|e| e.index != u32::MAX)
78                .collect::<Vec<_>>()
79                .len()
80        ]);
81        table.add_row(row!["String Tables", self.string_tables.tables.len()]);
82        table.add_row(row!["Tick", self.tick]);
83        table.add_row(row!["Net Tick", self.net_tick]);
84        table.add_row(row!["Game Build", format!("{:?}", self.game_build)]);
85        write!(f, "{}", table)
86    }
87}
88
89impl Display for Entities {
90    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
91        let mut table = Table::new();
92        table.add_row(row!["idx", "serial", "handle", "class"]);
93        for e in self.entities_vec.iter() {
94            if e.index() == u32::MAX {
95                continue;
96            }
97            table.add_row(row![
98                e.index().to_string(),
99                e.serial().to_string(),
100                e.handle().to_string(),
101                e.class().name(),
102            ]);
103        }
104        write!(f, "{}", table)
105    }
106}
107
108impl Display for Entity {
109    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
110        let mut table = Table::new();
111
112        table.add_row(row!["#", "Field", "Type", "Value"]);
113
114        for fp in self
115            .class
116            .serializer
117            .get_field_paths(&mut FieldPath::default(), &self.state)
118        {
119            let field_type = self.class.serializer.get_type_for_field_path(&fp);
120            let name = self.class.serializer.get_name_for_field_path(&fp);
121            let value = self.state.get_value(&fp);
122            if let Some(v) = value {
123                table.add_row(row![fp, name, field_type.to_string(), format!("{:?}", v)]);
124            } else {
125                table.add_row(row![fp, name, field_type.to_string(), "None"]);
126            }
127        }
128
129        write!(f, "{}", table)
130    }
131}
132
133impl Display for FieldValue {
134    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
135        match self {
136            FieldValue::Boolean(val) => write!(f, "{}", val),
137            FieldValue::String(val) => write!(f, "\"{}\"", val),
138            FieldValue::Float(val) => write!(f, "{}", val),
139            FieldValue::Vector2D(val) => write!(f, "[{}, {}]", val[0], val[1]),
140            FieldValue::Vector3D(val) => write!(f, "[{}, {}, {}]", val[0], val[1], val[2]),
141            FieldValue::Vector4D(val) => {
142                write!(f, "[{}, {}, {}, {}]", val[0], val[1], val[2], val[3])
143            }
144            FieldValue::Signed8(val) => write!(f, "{}", val),
145            FieldValue::Signed16(val) => write!(f, "{}", val),
146            FieldValue::Signed32(val) => write!(f, "{}", val),
147            FieldValue::Signed64(val) => write!(f, "{}", val),
148            FieldValue::Unsigned8(val) => write!(f, "{}", val),
149            FieldValue::Unsigned16(val) => write!(f, "{}", val),
150            FieldValue::Unsigned32(val) => write!(f, "{}", val),
151            FieldValue::Unsigned64(val) => write!(f, "{}", val),
152        }
153    }
154}
155
156impl Display for GameEvent<'_> {
157    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
158        let mut table = Table::new();
159
160        table.add_row(row!["Key", "Value"]);
161
162        for (key, value) in self.iter() {
163            table.add_row(row![key, format!("{:?}", value)]);
164        }
165
166        write!(f, "{}", table)
167    }
168}
169
170impl Display for GameEventList {
171    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
172        let mut table = Table::new();
173
174        for (id, definition) in self
175            .list
176            .iter()
177            .collect::<std::collections::BTreeMap<_, _>>()
178        {
179            table.add_row(row![id, definition.name]);
180        }
181
182        write!(f, "{}", table)
183    }
184}
185
186impl Display for FieldType {
187    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
188        let mut x = self.base.to_string();
189        if let Some(generic) = &self.generic {
190            x = x + "< " + &generic.to_string() + " >";
191        }
192        if self.pointer {
193            x += "*";
194        }
195        if self.count > 0 {
196            x = x + "[" + &self.count.to_string() + "]";
197        }
198        write!(f, "{}", x)
199    }
200}
201
202impl Display for FieldDecoder {
203    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
204        let output = match &self {
205            FieldDecoder::Boolean => "bool",
206            FieldDecoder::String => "String",
207            FieldDecoder::Signed8 => "i32",
208            FieldDecoder::Signed16 => "i16",
209            FieldDecoder::Signed32 => "i32",
210            FieldDecoder::Unsigned8 => "u8",
211            FieldDecoder::Unsigned16 => "u16",
212            FieldDecoder::Unsigned32 => "u32",
213            FieldDecoder::Vector(_, count) => &format!("[f32; {}]", count),
214            FieldDecoder::Unsigned64(_) => "u64",
215            FieldDecoder::Float32(_) => "f32",
216            FieldDecoder::QuantizedFloat(_) => "f32",
217            FieldDecoder::QAngle(_) => "[f32; 3]",
218            FieldDecoder::CCSGameModeRules => "bool",
219        };
220        write!(f, "{output}")
221    }
222}