hawktracer_parser/
event_klass.rs1use crate::event::DataType;
2
3pub struct EventKlassField {
4 name: String,
5 type_name: String,
6 data_type: DataType,
7}
8
9pub struct EventKlass {
10 fields: std::vec::Vec<EventKlassField>,
11 name: String,
12 id: u32,
13}
14
15impl EventKlass {
16 pub fn new(id: u32, name: String) -> EventKlass {
17 EventKlass {
18 fields: vec![],
19 name,
20 id,
21 }
22 }
23
24 pub fn get_name(&self) -> &String {
25 &self.name
26 }
27
28 pub fn get_id(&self) -> u32 {
29 self.id
30 }
31
32 pub fn get_fields(&self) -> &std::vec::Vec<EventKlassField> {
33 &self.fields
34 }
35
36 pub fn add_field(&mut self, name: String, type_name: String, data_type: DataType) {
37 for field in &self.fields {
38 if *field.get_name() == name {
39 return; }
41 }
42 self.fields
43 .push(EventKlassField::new(name, type_name, data_type));
44 }
45}
46
47impl EventKlassField {
48 pub fn new(name: String, type_name: String, data_type: DataType) -> EventKlassField {
49 EventKlassField {
50 name,
51 type_name,
52 data_type,
53 }
54 }
55
56 pub fn get_name(&self) -> &String {
57 &self.name
58 }
59
60 pub fn get_data_type(&self) -> &DataType {
61 &self.data_type
62 }
63
64 pub fn get_type_name(&self) -> &String {
65 &self.type_name
66 }
67}
68
69#[cfg(test)]
70mod tests {
71 use super::*;
72
73 #[test]
74 fn get_klass_name_should_return_correct_value() {
75 assert_eq!(
76 *EventKlass::new(9, "klass_name".to_string()).get_name(),
77 "klass_name".to_string()
78 );
79 }
80
81 #[test]
82 fn get_klass_name_id_return_correct_value() {
83 assert_eq!(EventKlass::new(9, "klass_name".to_string()).get_id(), 9);
84 }
85
86 #[test]
87 fn insert_field_should_add_new_field_to_klass() {
88 let mut klass = EventKlass::new(9, "klass_name".to_string());
89 klass.add_field("name".to_string(), "type".to_string(), DataType::U32);
90
91 let field = &klass.get_fields()[0];
92 assert_eq!(*field.get_data_type(), DataType::U32);
93 assert_eq!(*field.get_type_name(), "type".to_string());
94 assert_eq!(*field.get_name(), "name".to_string());
95
96 assert_eq!(klass.get_fields().len(), 1);
97 }
98
99 #[test]
100 fn insert_field_with_the_same_name_twice_should_only_add_first_field() {
101 let mut klass = EventKlass::new(9, "klass_name".to_string());
102 klass.add_field("name".to_string(), "type1".to_string(), DataType::U32);
103 klass.add_field("name".to_string(), "type2".to_string(), DataType::U8);
104
105 let field = &klass.get_fields()[0];
106 assert_eq!(*field.get_data_type(), DataType::U32);
107 assert_eq!(*field.get_type_name(), "type1".to_string());
108 assert_eq!(*field.get_name(), "name".to_string());
109
110 assert_eq!(klass.get_fields().len(), 1);
111 }
112}