use serde::ser::{Serialize, SerializeMap, Serializer}; use serde_json::Value; use crate::serialization_helpers::{ SerializableOptionalTimestampColumn, SerializableSingleValueColumn, }; use crate::thread_string_table::ThreadInternalStringIndex; use crate::{MarkerTiming, Timestamp}; #[derive(Debug, Clone, Default)] pub struct MarkerTable { marker_name_string_indexes: Vec, marker_starts: Vec>, marker_ends: Vec>, marker_phases: Vec, marker_datas: Vec, } impl MarkerTable { pub fn new() -> Self { Default::default() } pub fn add_marker( &mut self, name: ThreadInternalStringIndex, timing: MarkerTiming, data: Value, ) { let (s, e, phase) = match timing { MarkerTiming::Instant(s) => (Some(s), None, Phase::Instant), MarkerTiming::Interval(s, e) => (Some(s), Some(e), Phase::Interval), MarkerTiming::IntervalStart(s) => (Some(s), None, Phase::IntervalStart), MarkerTiming::IntervalEnd(e) => (None, Some(e), Phase::IntervalEnd), }; self.marker_name_string_indexes.push(name); self.marker_starts.push(s); self.marker_ends.push(e); self.marker_phases.push(phase); self.marker_datas.push(data); } } impl Serialize for MarkerTable { fn serialize(&self, serializer: S) -> Result { let len = self.marker_name_string_indexes.len(); let mut map = serializer.serialize_map(None)?; map.serialize_entry("length", &len)?; map.serialize_entry("category", &SerializableSingleValueColumn(0, len))?; map.serialize_entry("data", &self.marker_datas)?; map.serialize_entry( "endTime", &SerializableOptionalTimestampColumn(&self.marker_ends), )?; map.serialize_entry("name", &self.marker_name_string_indexes)?; map.serialize_entry("phase", &self.marker_phases)?; map.serialize_entry( "startTime", &SerializableOptionalTimestampColumn(&self.marker_starts), )?; map.end() } } #[derive(Debug, Clone, Copy)] #[repr(u8)] enum Phase { Instant = 0, Interval = 1, IntervalStart = 2, IntervalEnd = 3, } impl Serialize for Phase { fn serialize(&self, serializer: S) -> Result { serializer.serialize_u8(*self as u8) } }