profile_inspect/types/
cpu.rs1use serde::Deserialize;
2
3#[derive(Debug, Deserialize)]
5#[serde(rename_all = "camelCase")]
6pub struct CpuProfile {
7 pub nodes: Vec<CpuProfileNode>,
9
10 #[serde(default)]
12 pub samples: Vec<u32>,
13
14 #[serde(default)]
16 pub time_deltas: Vec<i64>,
17
18 pub start_time: u64,
20
21 pub end_time: u64,
23}
24
25#[derive(Debug, Deserialize)]
27#[serde(rename_all = "camelCase")]
28pub struct CpuProfileNode {
29 pub id: u32,
31
32 pub call_frame: CallFrame,
34
35 #[serde(default)]
37 pub children: Vec<u32>,
38
39 #[serde(default)]
41 pub hit_count: u32,
42
43 #[serde(default)]
45 pub position_ticks: Vec<PositionTickInfo>,
46}
47
48#[derive(Debug, Deserialize)]
50#[serde(rename_all = "camelCase")]
51pub struct CallFrame {
52 pub function_name: String,
54
55 #[serde(default)]
57 pub script_id: String,
58
59 #[serde(default)]
61 pub url: String,
62
63 #[serde(default)]
65 pub line_number: i32,
66
67 #[serde(default)]
69 pub column_number: i32,
70}
71
72#[derive(Debug, Deserialize)]
74#[serde(rename_all = "camelCase")]
75pub struct PositionTickInfo {
76 pub line: u32,
78
79 pub ticks: u32,
81}
82
83impl CpuProfile {
84 pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
89 serde_json::from_str(json)
90 }
91
92 pub fn duration_us(&self) -> u64 {
94 self.end_time.saturating_sub(self.start_time)
95 }
96
97 #[expect(clippy::cast_precision_loss)]
99 pub fn duration_ms(&self) -> f64 {
100 self.duration_us() as f64 / 1000.0
101 }
102}