extern crate serde_json;
use std::collections::HashMap;
use super::threadinfo::Thread;
#[derive(Debug, Serialize, Deserialize)]
pub struct SpeedscopeFile {
#[serde(rename = "$schema")]
schema: String,
profiles: Vec<Profile>,
shared: Shared,
#[serde(rename = "activeProfileIndex")]
active_profile_index: Option<f64>,
exporter: Option<String>,
name: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
struct Profile {
#[serde(rename = "type")]
profile_type: ProfileType,
name: String,
unit: ValueUnit,
#[serde(rename = "startValue")]
start_value: f64,
#[serde(rename = "endValue")]
end_value: f64,
samples: Vec<Vec<usize>>,
weights: Vec<f64>,
}
#[derive(Debug, Serialize, Deserialize)]
struct Shared {
frames: Vec<Frame>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Frame {
pub name: String,
pub file: Option<String>,
pub line: Option<u32>,
pub col: Option<u32>,
}
#[derive(Debug, Serialize, Deserialize)]
enum ProfileType {
#[serde(rename = "evented")]
Evented,
#[serde(rename = "sampled")]
Sampled,
}
#[derive(Debug, Serialize, Deserialize)]
enum ValueUnit {
#[serde(rename = "bytes")]
Bytes,
#[serde(rename = "microseconds")]
Microseconds,
#[serde(rename = "milliseconds")]
Milliseconds,
#[serde(rename = "nanoseconds")]
Nanoseconds,
#[serde(rename = "none")]
None,
#[serde(rename = "seconds")]
Seconds,
}
impl SpeedscopeFile {
pub fn new(
samples: HashMap<Option<Thread>, Vec<Vec<usize>>>,
frames: Vec<Frame>,
) -> SpeedscopeFile {
let end_value = samples.len().clone();
SpeedscopeFile {
schema: "https://www.speedscope.app/file-format-schema.json".to_string(),
active_profile_index: None,
name: Some("vignette profile".to_string()),
exporter: Some(format!("vignette@{}", env!("CARGO_PKG_VERSION"))),
profiles: samples
.iter()
.map(|(option_pid, samples)| {
let weights: Vec<f64> = (&samples).into_iter().map(|_s| 1 as f64).collect();
return Profile {
profile_type: ProfileType::Sampled,
name: option_pid.map_or("vignette profile".to_string(), |pid| {
format!("vignette profile {:?}", pid)
}),
unit: ValueUnit::None,
start_value: 0.0,
end_value: end_value as f64,
samples: samples.clone(),
weights: weights,
};
})
.collect(),
shared: Shared { frames: frames },
}
}
}