use serde::Deserialize;
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct HeapProfile {
pub head: HeapProfileNode,
#[serde(default)]
pub samples: Vec<HeapSample>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct HeapProfileNode {
pub call_frame: HeapCallFrame,
#[serde(default)]
pub self_size: u64,
#[serde(default)]
pub id: u32,
#[serde(default)]
pub children: Vec<HeapProfileNode>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct HeapCallFrame {
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 HeapSample {
pub size: u64,
pub node_id: u32,
#[serde(default)]
pub ordinal: u32,
}
impl HeapProfile {
pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
let mut deserializer = serde_json::Deserializer::from_str(json);
deserializer.disable_recursion_limit();
let deserializer = serde_stacker::Deserializer::new(&mut deserializer);
HeapProfile::deserialize(deserializer)
}
pub fn total_bytes(&self) -> u64 {
self.samples.iter().map(|s| s.size).sum()
}
}