type StrCow = std::borrow::Cow<'static, str>;
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SpeedscopeFile {
#[serde(rename = "$schema")]
pub schema: &'static str,
pub profiles: Vec<Profile>,
pub shared: Shared,
pub active_profile_index: Option<u64>,
pub exporter: Option<String>,
pub name: Option<String>,
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
#[serde(rename_all = "camelCase")]
pub enum Profile {
#[serde(rename_all = "camelCase")]
Sampled {
name: StrCow,
unit: ValueUnit,
start_value: u64,
end_value: u64,
samples: Vec<SampledStack>,
weights: Vec<u64>,
},
#[serde(rename_all = "camelCase")]
Evented {
name: StrCow,
unit: ValueUnit,
start_value: u64,
end_value: u64,
events: Vec<Event>,
},
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub struct Event {
#[serde(rename = "type")]
pub event_type: EventType,
pub at: u64,
pub frame: usize,
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub enum EventType {
#[serde(rename = "O")]
OpenFrame,
#[serde(rename = "C")]
CloseFrame,
}
type SampledStack = Vec<usize>;
#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub struct Shared {
pub frames: Vec<Frame>,
}
#[derive(Debug, PartialEq, Clone, Eq, Hash, Serialize, Deserialize)]
pub struct Frame {
pub name: StrCow,
pub file: Option<String>,
pub line: Option<u32>,
pub col: Option<u32>,
}
impl Frame {
#[inline]
pub fn new(name: StrCow) -> Frame {
Frame {
name,
file: None,
line: None,
col: None,
}
}
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ValueUnit {
Bytes,
Microseconds,
Milliseconds,
Nanoseconds,
None,
Seconds,
}