Use custom types to deserialize `--timings=json` output

finchie
Apr 22, 2024, 4:57 AM
V2NPEIA6ZXW2FE24IQBPLUICWIGMW7R2K7MNXUUKMOAAQWSQ36WQC

Dependencies

  • [2] LOR3KOXG Parse JSON output from `cargo build --timings`

Change contents

  • replacement in src/timings.rs at line 4
    [2.108][2.108:149]()
    use cargo_metadata::{PackageId, Target};
    [2.108]
    [2.149]
    use cargo_metadata::camino::Utf8PathBuf;
    use cargo_metadata::{Edition, PackageId};
  • replacement in src/timings.rs at line 9
    [2.263][2.263:353]()
    const CARGO_CUSOTM_PROFILE: [&str; 2] = ["--config", r#"profile.depwiz.inherits="dev""#];
    [2.263]
    [2.353]
    const CARGO_CUSTOM_PROFILE: [&str; 2] = ["--config", r#"profile.depwiz.inherits="dev""#];
    /// See https://doc.rust-lang.org/nightly/nightly-rustc/cargo/util/machine_message/struct.TimingInfo.html#method.reason
    /// This should always be "timing-info"
    #[derive(Clone, Debug, Serialize, Deserialize)]
    #[serde(rename_all = "kebab-case")]
    enum Reason {
    TimingInfo,
    }
  • edit in src/timings.rs at line 28
    [2.617]
    [2.617]
    /// See https://doc.rust-lang.org/nightly/nightly-rustc/cargo/core/manifest/enum.TargetKind.html
    /// and https://doc.rust-lang.org/nightly/nightly-rustc/cargo/core/manifest/enum.TargetKind.html#impl-Serialize-for-TargetKind
    /// This is different to the original enum as `CrateType` has been manually flattened into this enum,
    /// so some information is lost in favour of simplicity
    // TODO: fix this limitation, make `TargetKind` match cargo's definition
    #[derive(Clone, Debug, Serialize, Deserialize)]
    #[serde(rename_all = "kebab-case")]
    enum TargetKind {
    Lib,
    Bin,
    Test,
    Bench,
    ExampleLib,
    ExampleBin,
    CustomBuild,
    Rlib,
    Dylib,
    Cdylib,
    Staticlib,
    ProcMacro,
    }
    /// See https://doc.rust-lang.org/nightly/nightly-rustc/cargo/core/manifest/struct.TargetInner.html
    #[derive(Clone, Debug, Serialize, Deserialize)]
    struct Target {
    kind: Vec<TargetKind>,
    name: String,
    src_path: Utf8PathBuf,
    edition: Edition,
    doc: bool,
    doctest: bool,
    test: bool,
    }
  • edit in src/timings.rs at line 63
    [2.704]
    [2.704]
    /// The `Reason` enum only has a `timing-info` variant so this should make sure cargo isn't
    /// generating any unexpected messages
  • replacement in src/timings.rs at line 67
    [2.773][2.773:793]()
    reason: String,
    [2.773]
    [2.793]
    reason: Reason,
  • replacement in src/timings.rs at line 79
    [2.1069][2.1069:1105]()
    .args(CARGO_CUSOTM_PROFILE)
    [2.1069]
    [2.1105]
    .args(CARGO_CUSTOM_PROFILE)
  • replacement in src/timings.rs at line 88
    [2.1319][2.1319:1355]()
    .args(CARGO_CUSOTM_PROFILE)
    [2.1319]
    [2.1355]
    .args(CARGO_CUSTOM_PROFILE)
  • edit in src/timings.rs at line 125
    [2.2512][2.2512:2621]()
    // Make sure it's actually a timings message
    assert_eq!(json_message.reason, "timing-info");