use serde::Deserialize;
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CpuProfile {
pub nodes: Vec<CpuProfileNode>,
#[serde(default)]
pub samples: Vec<u32>,
#[serde(default)]
pub time_deltas: Vec<i64>,
pub start_time: u64,
pub end_time: u64,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CpuProfileNode {
pub id: u32,
pub call_frame: CallFrame,
#[serde(default)]
pub children: Vec<u32>,
#[serde(default)]
pub hit_count: u32,
#[serde(default)]
pub position_ticks: Vec<PositionTickInfo>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CallFrame {
pub function_name: String,
#[serde(default)]
pub script_id: String,
#[serde(default)]
pub url: String,
#[serde(default)]
pub line_number: i32,
#[serde(default)]
pub column_number: i32,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PositionTickInfo {
pub line: u32,
pub ticks: u32,
}
impl CpuProfile {
pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
serde_json::from_str(json)
}
pub fn duration_us(&self) -> u64 {
self.end_time.saturating_sub(self.start_time)
}
#[expect(clippy::cast_precision_loss)]
pub fn duration_ms(&self) -> f64 {
self.duration_us() as f64 / 1000.0
}
}