blob: 52a18b5fb418cd772887be5fa0f82b9ba7b6e57e [file] [edit]
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"
}
}