1use crate::data_provider::DataProvider;
2use crate::data_struct_reader::{DataStructReader, ReadEventError};
3use crate::event::Event;
4use crate::registry::{CoreEventKlassId, EventKlassRegistry};
5use crate::registry_updater::RegistryUpdater;
6
7pub struct EventReader {
8 data_provider: DataProvider,
9}
10
11impl EventReader {
12 pub fn new(data_provider: DataProvider) -> EventReader {
13 EventReader { data_provider }
14 }
15
16 pub fn read_event(
17 &mut self,
18 registry: &mut EventKlassRegistry,
19 ) -> Result<Event, ReadEventError> {
20 let base_event = self.read_header(registry)?;
21
22 let klass_id = base_event
23 .get_value_u32("type")
24 .expect("Cannot find 'type' field in base klass. Registry corrupted?");
25
26 if klass_id == CoreEventKlassId::Base as u32 {
27 return Ok(base_event);
28 }
29
30 let event = self.read_regular_event(registry, klass_id, base_event)?;
31
32 if klass_id == CoreEventKlassId::KlassInfo as u32
33 || klass_id == CoreEventKlassId::FieldInfo as u32
34 {
35 if let Err(err) = RegistryUpdater::new(registry).update_registry_from_event(&event) {
36 return Err(ReadEventError::RegistryUpdateFailed(err.to_owned()));
37 }
38 }
39
40 Ok(event)
41 }
42
43 fn read_regular_event(
44 &mut self,
45 registry: &EventKlassRegistry,
46 klass_id: u32,
47 base_event: Event,
48 ) -> Result<Event, ReadEventError> {
49 let klass = match registry.get_klass_by_id(klass_id) {
50 Some(klass) => klass,
51 None => return Err(ReadEventError::UnknownKlassId(klass_id)),
52 };
53
54 DataStructReader::new(&mut self.data_provider, registry, klass, Some(base_event))
55 .read_event()
56 }
57
58 fn read_header(&mut self, registry: &mut EventKlassRegistry) -> Result<Event, ReadEventError> {
59 let base_event_klass = registry
60 .get_klass_by_id(CoreEventKlassId::Base as u32)
61 .expect("Can not find Base klass definition!");
62
63 DataStructReader::new(&mut self.data_provider, registry, base_event_klass, None)
64 .read_event()
65 }
66}
67
68#[cfg(test)]
69pub mod tests {
70 use super::*;
71 use hawktracer_parser_test_utilities::FakeDataReader;
72 use crate::event_klass::EventKlass;
73 use crate::event::DataType;
74
75 #[test]
76 fn read_header_should_return_valid_base_event() {
77 let data = vec![
78 1, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, ];
82 let mut reg = EventKlassRegistry::new();
83 let data_provider = DataProvider::new(Box::new(FakeDataReader::new(data, false)));
84
85 let event = EventReader::new(data_provider)
86 .read_header(&mut reg)
87 .unwrap();
88
89 assert_eq!(event.get_value_u32(&"type").unwrap(), 1);
90 assert_eq!(event.get_value_u64(&"timestamp").unwrap(), 513);
91 assert_eq!(event.get_value_u64(&"id").unwrap(), 2);
92 }
93
94
95 #[test]
96 fn read_event_should_return_full_event() {
97 let data = vec![
98 100, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 65, 66, 67, 0, 45, 1, 0, 0, ];
104 let mut reg = EventKlassRegistry::new();
105 let data_provider = DataProvider::new(Box::new(FakeDataReader::new(data, false)));
106
107 let mut klass = EventKlass::new(100, "foo".to_owned());
108 klass.add_field("base".to_owned(), "HT_Event".to_owned(), DataType::Struct);
109 klass.add_field("str_field".to_owned(), "char*".to_owned(), DataType::Str);
110 klass.add_field("u32_field".to_owned(), "uint32_t".to_owned(), DataType::U32);
111
112 reg.add_klass(klass);
113
114 let event = EventReader::new(data_provider)
115 .read_event(&mut reg)
116 .unwrap();
117
118 assert_eq!(event.get_klass_id(), 100);
119
120 let base_event = event.get_value_struct(&"base").unwrap();
121 assert_eq!(base_event.get_value_u32(&"type").unwrap(), 100);
122 assert_eq!(base_event.get_value_u64(&"timestamp").unwrap(), 513);
123 assert_eq!(base_event.get_value_u64(&"id").unwrap(), 2);
124
125 assert_eq!(event.get_value_string(&"str_field").unwrap(), "ABC");
126 assert_eq!(event.get_value_u32(&"u32_field").unwrap(), 301);
127 }
128}