1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
//! This module contains the definition of the OneLog struct.
use std::str::FromStr;
use crate::data::{AdditionalInfos, Trace};
use crate::errors::TramexError;
use crate::interface::functions::extract_hexe;
use crate::interface::{layer::Layer, types::SourceLog};
use crate::tramex_error;
use super::parser::parser_rrc::RRCInfos;
use super::types::Direction; // to use the FileParser trait and implementations
#[derive(serde::Deserialize, Debug)]
/// Data structure to store the log.
pub struct OneLog {
/// Each item is a string representing a line of log.
pub data: Vec<String>,
/// Milliseconds since January 1st 1970.
pub timestamp: u64,
/// log layer
pub layer: Layer,
/// Source of the log.
pub src: SourceLog,
/// index
pub idx: u64,
/// index
pub dir: Option<String>,
}
impl OneLog {
/// Extract the hexadecimal representation of the log.
/// # Errors
/// Returns a TramexError if the hexe representation could not be extracted.
pub fn extract_hexe(&self) -> Result<Vec<u8>, TramexError> {
extract_hexe(&self.data)
}
/// Extract the canal message of the log.
pub fn extract_canal_msg(&self) -> Option<String> {
// TODO implement this function correctly
if let Some(data_line) = self.data.first() {
log::debug!("{:?}", data_line);
return Some(data_line.to_owned());
}
None
}
/// Extract the data of the log.
/// # Errors
/// Returns a TramexError if the data could not be extracted.
pub fn extract_data(&self) -> Result<Trace, TramexError> {
match self.layer {
Layer::RRC => {
let dir = match &self.dir {
Some(opt_dir) => match Direction::from_str(opt_dir) {
Ok(d) => d,
Err(_) => {
return Err(tramex_error!(
format!("Can't format direction {}", opt_dir),
crate::errors::ErrorCode::WebSocketErrorDecodingMessage
));
}
},
None => {
return Err(tramex_error!(
"Direction not found".to_owned(),
crate::errors::ErrorCode::WebSocketErrorDecodingMessage
));
}
};
let firs_line = self.data[0].split(':').collect::<Vec<&str>>();
if firs_line.len() < 2 {
return Err(tramex_error!(
format!("Invalid first line {}", self.data[0]),
crate::errors::ErrorCode::WebSocketErrorDecodingMessage
));
}
let rrc: RRCInfos = RRCInfos {
direction: dir,
canal: firs_line[0].to_owned(),
canal_msg: firs_line[1][1..].to_owned(),
};
let infos = AdditionalInfos::RRCInfos(rrc);
let trace = Trace {
timestamp: self.timestamp.to_owned(),
layer: Layer::RRC,
additional_infos: infos,
hexa: self.extract_hexe().unwrap_or_default(),
text: Some(self.data[1..].iter().map(|x| x.to_string()).collect()),
};
Ok(trace)
}
_ => Err(tramex_error!(
format!("Layer {:?} not implemented", self.layer),
crate::errors::ErrorCode::ParsingLayerNotImplemented
)),
}
}
}