cargo/util/
machine_message.rs1use std::path::{Path, PathBuf};
2
3use cargo_util_schemas::core::PackageIdSpec;
4use serde::Serialize;
5use serde::ser;
6use serde_json::value::RawValue;
7
8use crate::core::Target;
9
10pub trait Message: ser::Serialize {
11 fn reason(&self) -> &str;
12
13 fn to_json_string(&self) -> String {
14 #[derive(Serialize)]
15 struct WithReason<'a, S: Serialize> {
16 reason: &'a str,
17 #[serde(flatten)]
18 msg: &'a S,
19 }
20 let with_reason = WithReason {
21 reason: self.reason(),
22 msg: &self,
23 };
24 serde_json::to_string(&with_reason).unwrap()
25 }
26}
27
28#[derive(Serialize)]
29pub struct FromCompiler<'a> {
30 pub package_id: PackageIdSpec,
31 pub manifest_path: &'a Path,
32 pub target: &'a Target,
33 pub message: Box<RawValue>,
34}
35
36impl<'a> Message for FromCompiler<'a> {
37 fn reason(&self) -> &str {
38 "compiler-message"
39 }
40}
41
42#[derive(Serialize)]
43pub struct Artifact<'a> {
44 pub package_id: PackageIdSpec,
45 pub manifest_path: PathBuf,
46 pub target: &'a Target,
47 pub profile: ArtifactProfile,
48 pub features: Vec<String>,
49 pub filenames: Vec<PathBuf>,
50 pub executable: Option<PathBuf>,
51 pub fresh: bool,
52}
53
54impl<'a> Message for Artifact<'a> {
55 fn reason(&self) -> &str {
56 "compiler-artifact"
57 }
58}
59
60#[derive(Serialize)]
64pub struct ArtifactProfile {
65 pub opt_level: &'static str,
66 pub debuginfo: Option<ArtifactDebuginfo>,
67 pub debug_assertions: bool,
68 pub overflow_checks: bool,
69 pub test: bool,
70}
71
72#[derive(Serialize)]
74#[serde(untagged)]
75pub enum ArtifactDebuginfo {
76 Int(u32),
77 Named(&'static str),
78}
79
80#[derive(Serialize)]
81pub struct BuildScript<'a> {
82 pub package_id: PackageIdSpec,
83 pub linked_libs: &'a [String],
84 pub linked_paths: &'a [String],
85 pub cfgs: &'a [String],
86 pub env: &'a [(String, String)],
87 pub out_dir: &'a Path,
88}
89
90impl<'a> Message for BuildScript<'a> {
91 fn reason(&self) -> &str {
92 "build-script-executed"
93 }
94}
95
96#[derive(Serialize)]
97pub struct BuildFinished {
98 pub success: bool,
99}
100
101impl Message for BuildFinished {
102 fn reason(&self) -> &str {
103 "build-finished"
104 }
105}