profile_inspect/types/
heap.rs1use serde::Deserialize;
2
3#[derive(Debug, Deserialize)]
5#[serde(rename_all = "camelCase")]
6pub struct HeapProfile {
7 pub head: HeapProfileNode,
9
10 #[serde(default)]
12 pub samples: Vec<HeapSample>,
13}
14
15#[derive(Debug, Deserialize)]
17#[serde(rename_all = "camelCase")]
18pub struct HeapProfileNode {
19 pub call_frame: HeapCallFrame,
21
22 #[serde(default)]
24 pub self_size: u64,
25
26 #[serde(default)]
28 pub id: u32,
29
30 #[serde(default)]
32 pub children: Vec<HeapProfileNode>,
33}
34
35#[derive(Debug, Deserialize)]
37#[serde(rename_all = "camelCase")]
38pub struct HeapCallFrame {
39 pub function_name: String,
41
42 #[serde(default)]
44 pub script_id: String,
45
46 #[serde(default)]
48 pub url: String,
49
50 #[serde(default)]
52 pub line_number: i32,
53
54 #[serde(default)]
56 pub column_number: i32,
57}
58
59#[derive(Debug, Deserialize)]
61#[serde(rename_all = "camelCase")]
62pub struct HeapSample {
63 pub size: u64,
65
66 pub node_id: u32,
68
69 #[serde(default)]
71 pub ordinal: u32,
72}
73
74impl HeapProfile {
75 pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
80 let mut deserializer = serde_json::Deserializer::from_str(json);
83 deserializer.disable_recursion_limit();
84 let deserializer = serde_stacker::Deserializer::new(&mut deserializer);
85 HeapProfile::deserialize(deserializer)
86 }
87
88 pub fn total_bytes(&self) -> u64 {
90 self.samples.iter().map(|s| s.size).sum()
91 }
92}