diff --git a/packages/cli/src/build/builder.rs b/packages/cli/src/build/builder.rs index 99eab23c4..519dafc14 100644 --- a/packages/cli/src/build/builder.rs +++ b/packages/cli/src/build/builder.rs @@ -380,7 +380,7 @@ impl AppBuilder { tracing::info!(json = ?StructuredOutput::BuildUpdate { stage: stage.clone() }); } BuilderUpdate::CompilerMessage { message } => { - tracing::info!(json = ?StructuredOutput::CargoOutput { message: message.clone() }, %message); + tracing::info!(json = ?StructuredOutput::RustcOutput { message: message.clone() }, %message); } BuilderUpdate::BuildReady { bundle } => { tracing::debug!(json = ?StructuredOutput::BuildFinished { @@ -392,7 +392,7 @@ impl AppBuilder { // Flush remaining compiler messages while let Ok(Some(msg)) = self.rx.try_next() { if let BuilderUpdate::CompilerMessage { message } = msg { - tracing::info!(json = ?StructuredOutput::CargoOutput { message: message.clone() }, %message); + tracing::info!(json = ?StructuredOutput::RustcOutput { message: message.clone() }, %message); } } diff --git a/packages/cli/src/build/context.rs b/packages/cli/src/build/context.rs index 33eec6f9f..fc119bc85 100644 --- a/packages/cli/src/build/context.rs +++ b/packages/cli/src/build/context.rs @@ -2,7 +2,7 @@ use super::BuildMode; use crate::{BuildArtifacts, BuildStage, Error, TraceSrc}; -use cargo_metadata::CompilerMessage; +use cargo_metadata::diagnostic::Diagnostic; use futures_channel::mpsc::{UnboundedReceiver, UnboundedSender}; use serde::{Deserialize, Serialize}; use std::{path::PathBuf, process::ExitStatus}; @@ -35,7 +35,7 @@ pub enum BuilderUpdate { }, CompilerMessage { - message: CompilerMessage, + message: Diagnostic, }, BuildReady { @@ -92,7 +92,7 @@ impl BuildContext { }) } - pub(crate) fn status_build_diagnostic(&self, message: CompilerMessage) { + pub(crate) fn status_build_diagnostic(&self, message: Diagnostic) { _ = self .tx .unbounded_send(BuilderUpdate::CompilerMessage { message }); diff --git a/packages/cli/src/build/request.rs b/packages/cli/src/build/request.rs index 7bdb5780d..6d2d10705 100644 --- a/packages/cli/src/build/request.rs +++ b/packages/cli/src/build/request.rs @@ -320,6 +320,7 @@ use crate::{ TargetArgs, TraceSrc, WasmBindgen, WasmOptConfig, Workspace, DX_RUSTC_WRAPPER_ENV_VAR, }; use anyhow::Context; +use cargo_metadata::diagnostic::Diagnostic; use dioxus_cli_config::format_base_path_meta_element; use dioxus_cli_config::{APP_TITLE_ENV, ASSET_ROOT_ENV}; use dioxus_cli_opt::{process_file_to, AssetManifest}; @@ -807,7 +808,7 @@ impl BuildRequest { match message { Message::BuildScriptExecuted(_) => units_compiled += 1, - Message::CompilerMessage(msg) => ctx.status_build_diagnostic(msg), + Message::CompilerMessage(msg) => ctx.status_build_diagnostic(msg.message), Message::TextLine(line) => { // Handle the case where we're getting lines directly from rustc. // These are in a different format than the normal cargo output, though I imagine @@ -829,6 +830,11 @@ impl BuildRequest { } } + // Handle direct rustc diagnostics + if let Ok(diag) = serde_json::from_str::(&line) { + ctx.status_build_diagnostic(diag); + } + // For whatever reason, if there's an error while building, we still receive the TextLine // instead of an "error" message. However, the following messages *also* tend to // be the error message, and don't start with "error:". So we'll check if we've already diff --git a/packages/cli/src/logging.rs b/packages/cli/src/logging.rs index 3aa5aed8e..7b7a6b076 100644 --- a/packages/cli/src/logging.rs +++ b/packages/cli/src/logging.rs @@ -15,7 +15,7 @@ //! 4. Build fmt layer for non-interactive logging with a custom writer that prevents output during interactive mode. use crate::{serve::ServeUpdate, Cli, Commands, Platform as TargetPlatform, Verbosity}; -use cargo_metadata::{diagnostic::DiagnosticLevel, CompilerMessage}; +use cargo_metadata::diagnostic::{Diagnostic, DiagnosticLevel}; use clap::Parser; use futures_channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender}; use once_cell::sync::OnceCell; @@ -349,7 +349,7 @@ pub struct TraceMsg { #[derive(Clone, PartialEq)] #[allow(clippy::large_enum_variant)] pub enum TraceContent { - Cargo(CompilerMessage), + Cargo(Diagnostic), Text(String), } @@ -366,9 +366,9 @@ impl TraceMsg { /// Create a new trace message from a cargo compiler message /// /// All `cargo` messages are logged at the `TRACE` level since they get *very* noisy during development - pub fn cargo(content: CompilerMessage) -> Self { + pub fn cargo(content: Diagnostic) -> Self { Self { - level: match content.message.level { + level: match content.level { DiagnosticLevel::Ice => Level::ERROR, DiagnosticLevel::Error => Level::ERROR, DiagnosticLevel::FailureNote => Level::ERROR, diff --git a/packages/cli/src/serve/output.rs b/packages/cli/src/serve/output.rs index 0cfb411f7..5c7db25f6 100644 --- a/packages/cli/src/serve/output.rs +++ b/packages/cli/src/serve/output.rs @@ -2,6 +2,7 @@ use crate::{ serve::{ansi_buffer::AnsiStringLine, ServeUpdate, WebServer}, BuildStage, BuilderUpdate, Platform, TraceContent, TraceMsg, TraceSrc, }; +use cargo_metadata::diagnostic::Diagnostic; use crossterm::{ cursor::{Hide, Show}, event::{ @@ -294,10 +295,10 @@ impl Output { self.pending_logs.push_front(message); } - pub fn push_cargo_log(&mut self, message: cargo_metadata::CompilerMessage) { + pub fn push_cargo_log(&mut self, message: Diagnostic) { use cargo_metadata::diagnostic::DiagnosticLevel; - if self.trace || !matches!(message.message.level, DiagnosticLevel::Note) { + if self.trace || !matches!(message.level, DiagnosticLevel::Note) { self.push_log(TraceMsg::cargo(message)); } } @@ -924,7 +925,7 @@ impl Output { use chrono::Timelike; let rendered = match log.content { - TraceContent::Cargo(msg) => msg.message.rendered.unwrap_or_default(), + TraceContent::Cargo(msg) => msg.rendered.unwrap_or_default(), TraceContent::Text(text) => text, }; diff --git a/packages/dx-wire-format/src/lib.rs b/packages/dx-wire-format/src/lib.rs index 43da1a1a6..c61d2e99e 100644 --- a/packages/dx-wire-format/src/lib.rs +++ b/packages/dx-wire-format/src/lib.rs @@ -1,4 +1,4 @@ -use cargo_metadata::CompilerMessage; +use cargo_metadata::{diagnostic::Diagnostic, CompilerMessage}; use serde::{Deserialize, Serialize}; use std::path::PathBuf; @@ -35,6 +35,9 @@ pub enum StructuredOutput { CargoOutput { message: CompilerMessage, }, + RustcOutput { + message: Diagnostic, + }, BundleOutput { bundles: Vec, },