| use std::path::{Path, PathBuf}; | |
| use cargo_util_schemas::core::PackageIdSpec; | |
| use serde::Serialize; | |
| use serde::ser; | |
| use serde_json::value::RawValue; | |
| use crate::workspace::Target; | |
| pub trait Message: ser::Serialize { | |
| fn reason(&self) -> &str; | |
| fn to_json_string(&self) -> String { | |
| #[derive(Serialize)] | |
| struct WithReason<'a, S: Serialize> { | |
| reason: &'a str, | |
| #[serde(flatten)] | |
| msg: &'a S, | |
| } | |
| let with_reason = WithReason { | |
| reason: self.reason(), | |
| msg: &self, | |
| }; | |
| serde_json::to_string(&with_reason).unwrap() | |
| } | |
| } | |
| #[derive(Serialize)] | |
| pub struct FromCompiler<'a> { | |
| pub package_id: PackageIdSpec, | |
| pub manifest_path: &'a Path, | |
| pub target: &'a Target, | |
| pub message: Box<RawValue>, | |
| } | |
| impl<'a> Message for FromCompiler<'a> { | |
| fn reason(&self) -> &str { | |
| "compiler-message" | |
| } | |
| } | |
| #[derive(Serialize)] | |
| pub struct Artifact<'a> { | |
| pub package_id: PackageIdSpec, | |
| pub manifest_path: PathBuf, | |
| pub target: &'a Target, | |
| pub profile: ArtifactProfile, | |
| pub features: Vec<String>, | |
| pub filenames: Vec<PathBuf>, | |
| pub executable: Option<PathBuf>, | |
| pub fresh: bool, | |
| } | |
| impl<'a> Message for Artifact<'a> { | |
| fn reason(&self) -> &str { | |
| "compiler-artifact" | |
| } | |
| } | |
| /// This is different from the regular `Profile` to maintain backwards | |
| /// compatibility (in particular, `test` is no longer in `Profile`, but we | |
| /// still want it to be included here). | |
| #[derive(Serialize)] | |
| pub struct ArtifactProfile { | |
| pub opt_level: &'static str, | |
| pub debuginfo: Option<ArtifactDebuginfo>, | |
| pub debug_assertions: bool, | |
| pub overflow_checks: bool, | |
| pub test: bool, | |
| } | |
| /// Internally this is an enum with different variants, but keep using 0/1/2 as integers for compatibility. | |
| #[derive(Serialize)] | |
| #[serde(untagged)] | |
| pub enum ArtifactDebuginfo { | |
| Int(u32), | |
| Named(&'static str), | |
| } | |
| #[derive(Serialize)] | |
| pub struct BuildScript<'a> { | |
| pub package_id: PackageIdSpec, | |
| pub linked_libs: &'a [String], | |
| pub linked_paths: &'a [String], | |
| pub cfgs: &'a [String], | |
| pub env: &'a [(String, String)], | |
| pub out_dir: &'a Path, | |
| } | |
| impl<'a> Message for BuildScript<'a> { | |
| fn reason(&self) -> &str { | |
| "build-script-executed" | |
| } | |
| } | |
| #[derive(Serialize)] | |
| pub struct BuildFinished { | |
| pub success: bool, | |
| } | |
| impl Message for BuildFinished { | |
| fn reason(&self) -> &str { | |
| "build-finished" | |
| } | |
| } | |
| #[derive(Serialize)] | |
| pub struct BuildStarted<'a> { | |
| pub run_id: &'a str, | |
| } | |
| impl Message for BuildStarted<'_> { | |
| fn reason(&self) -> &str { | |
| "build-started" | |
| } | |
| } |