Store timings output in `timings::Output` struct
Dependencies
- [2]
V2NPEIA6Use custom types to deserialize `--timings=json` output - [3]
UQJO24KBUse `forceatlas2` to construct graph layout - [4]
ZPFD3275Switch from `cargo_metadata`+`petgraph` to `guppy` - [5]
7CVIL7UJCreate simple metadata parser - [6]
LOR3KOXGParse JSON output from `cargo build --timings`
Change contents
- edit in src/timings.rs at line 1
use std::collections::HashMap; - replacement in src/timings.rs at line 6
use cargo_metadata::{Edition, PackageId};use cargo_metadata::Edition;use guppy::PackageId; - replacement in src/timings.rs at line 68
pub struct Message {struct Message { - replacement in src/timings.rs at line 70
package_id: PackageId,package_id: cargo_metadata::PackageId, - replacement in src/timings.rs at line 77[3.907]→[3.907:1069](∅→∅),[3.1069]→[2.1628:1664](∅→∅),[2.1664]→[3.1105:1250](∅→∅),[3.1105]→[3.1105:1250](∅→∅)
pub fn generate() -> Vec<Message> {// TODO: `cargo build --timings=json` seems to only work on a clean buildCommand::new("cargo").arg("clean").args(CARGO_CUSTOM_PROFILE).args(&["--profile", "depwiz"]).stdout(Stdio::inherit()).stderr(Stdio::inherit()).output().unwrap();pub struct Output {repr: HashMap<PackageId, Vec<Message>>,} - replacement in src/timings.rs at line 81[3.1251]→[3.1251:1319](∅→∅),[3.1319]→[2.1665:1701](∅→∅),[2.1701]→[3.1355:1565](∅→∅),[3.1355]→[3.1355:1565](∅→∅)
let timings_ouput = Command::new("cargo").arg("build").args(CARGO_CUSTOM_PROFILE).args(&["--profile","depwiz","-Zunstable-options","--timings=json",]).stderr(Stdio::inherit()).output().unwrap();impl Output {pub fn new() -> Self {// TODO: `cargo build --timings=json` seems to only work on a clean buildCommand::new("cargo").arg("clean").args(CARGO_CUSTOM_PROFILE).args(&["--profile", "depwiz"]).stdout(Stdio::inherit()).stderr(Stdio::inherit()).output().unwrap();let timings_ouput = Command::new("cargo").arg("build").args(CARGO_CUSTOM_PROFILE).args(&["--profile","depwiz","-Zunstable-options","--timings=json",]).stderr(Stdio::inherit()).output().unwrap(); - replacement in src/timings.rs at line 106
let mut timings = Vec::new();let mut timings_buffer = BufReader::new(timings_ouput.stdout.as_slice());let mut message_buffer = Vec::new();let mut timings = HashMap::new();let mut timings_buffer = BufReader::new(timings_ouput.stdout.as_slice());let mut message_buffer = Vec::new(); - replacement in src/timings.rs at line 110
loop {timings_buffer.read_until(b'\n', &mut message_buffer).unwrap();loop {timings_buffer.read_until(b'\n', &mut message_buffer).unwrap(); - replacement in src/timings.rs at line 115
let json_message: Message = match serde_json::from_slice(&message_buffer) {Ok(message) => message,Err(err) => {use serde_json::error::Category;match err.classify() {Category::Eof => break,Category::Data => todo!("JSON object not properly handled, got `{err:?}` for message: `{}`",String::from_utf8(message_buffer.clone()).unwrap()),_ => {panic!("Unexpected error while parsing: {err:?}");let json_message: Message = match serde_json::from_slice(&message_buffer) {Ok(message) => message,Err(err) => {use serde_json::error::Category;match err.classify() {Category::Eof => break,Category::Data => todo!("JSON object not properly handled, got `{err:?}` for message: `{}`",String::from_utf8(message_buffer.clone()).unwrap()),_ => {panic!("Unexpected error while parsing: {err:?}");} - replacement in src/timings.rs at line 130
}};};let pkg_id = PackageId::new(json_message.package_id.repr.clone());let pkg_timings: &mut Vec<Message> = timings.entry(pkg_id).or_default();pkg_timings.push(json_message);message_buffer.clear();} - replacement in src/timings.rs at line 139
timings.push(json_message);message_buffer.clear();Self { repr: timings } - edit in src/timings.rs at line 141
timings - replacement in src/main.rs at line 8
dbg!(timings::generate());let timings = timings::Output::new();