tramex_tools/interface/parser/
parser_basic.rs

1//! Basic parser for simple layers (PHY, RLC, MAC, PDCP, SDAP, etc.)
2use super::ParsingError;
3use super::hex_extractor::extract_binary_from_lines;
4use super::{LayerParser, ParsedHeader};
5use crate::data::{AdditionalInfos, Trace};
6use crate::interface::association::TraceRelation;
7use crate::interface::layer::Layer;
8
9/// Basic Parser for simple layers (PHY, RLC, MAC, PDCP, SDAP, etc.)
10/// This parser handles single-line logs with no complex structure
11pub struct BasicParser;
12
13impl BasicParser {
14    /// Parse a log with a specific layer type
15    /// # Errors
16    /// Return an error if the parsing fails
17    pub fn parse_with_layer(lines: &[String], layer: Layer) -> Result<Trace, ParsingError> {
18        if lines.is_empty() {
19            return Err(ParsingError::new(format!("{:?} parser received empty lines", layer), 0));
20        }
21
22        let text = lines.to_vec();
23        let binary = extract_binary_from_lines(lines);
24
25        // Parse timestamp from first line
26        let timestamp = if let Some(first_line) = lines.first() {
27            match chrono::NaiveDateTime::parse_from_str(first_line, "%Y-%m-%d %H:%M:%S%.3f") {
28                Ok(timestamp) => timestamp.and_utc().timestamp(),
29                Err(_) => super::parse_timestamp(first_line).unwrap_or_default(),
30            }
31        } else {
32            0
33        };
34
35        let trace = Trace {
36            timestamp,
37            layer,
38            additional_infos: AdditionalInfos::None,
39            text: Some(text),
40            binary,
41            relation: TraceRelation::default(),
42        };
43        Ok(trace)
44    }
45}
46
47impl LayerParser for BasicParser {
48    /// Basic layers have no structured additional info.
49    fn parse_layer(_header: &ParsedHeader, _data_lines: &[String]) -> Result<AdditionalInfos, ParsingError> {
50        Ok(AdditionalInfos::None)
51    }
52}