hawktracer_parser/
event_klass.rs

1use 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; // TODO error?
40            }
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}