diff --git a/crates/turbopack-core/src/diagnostics/mod.rs b/crates/turbopack-core/src/diagnostics/mod.rs new file mode 100644 index 00000000000000..2f46446c52dfb2 --- /dev/null +++ b/crates/turbopack-core/src/diagnostics/mod.rs @@ -0,0 +1,77 @@ +use std::collections::HashMap; + +use anyhow::Result; +use async_trait::async_trait; +use turbo_tasks::{emit, CollectiblesSource, Upcast, Vc}; + +#[turbo_tasks::value(serialization = "none")] +#[derive(Clone, Debug)] +pub struct PlainDiagnostic { + pub category: String, + pub name: String, + pub payload: HashMap, +} + +#[turbo_tasks::value(transparent)] +pub struct DiagnosticPayload(pub HashMap); + +/// An arbitrary payload can be used to analyze, diagnose +/// Turbopack's behavior. +#[turbo_tasks::value_trait] +pub trait Diagnostic { + // [TODO]: These are subject to change; not finalized yet. + fn category(&self) -> Vc; + fn name(&self) -> Vc; + fn payload(&self) -> Vc; + + async fn into_plain(self: Vc) -> Result> { + Ok(PlainDiagnostic { + category: self.category().await?.clone_value(), + name: self.name().await?.clone_value(), + payload: self.payload().await?.clone_value(), + } + .cell()) + } +} + +pub trait DiagnosticExt { + fn emit(self); +} + +impl DiagnosticExt for Vc +where + T: Upcast>, +{ + fn emit(self) { + let diagnostic = Vc::upcast::>(self); + emit(diagnostic); + } +} + +#[async_trait] +pub trait DiagnosticContextExt +where + Self: Sized, +{ + async fn peek_diagnostics(self) -> Result>; +} + +#[async_trait] +impl DiagnosticContextExt for T +where + T: CollectiblesSource + Copy + Send, +{ + async fn peek_diagnostics(self) -> Result> { + Ok(CapturedDiagnostics::cell(CapturedDiagnostics { + diagnostics: self.peek_collectibles().strongly_consistent().await?, + })) + } +} + +/// A list of diagnostics captured with +/// [`DiagnosticsVc::peek_diagnostics_with_path`] and +#[derive(Debug)] +#[turbo_tasks::value] +pub struct CapturedDiagnostics { + pub diagnostics: auto_hash_map::AutoSet>>, +} diff --git a/crates/turbopack-core/src/lib.rs b/crates/turbopack-core/src/lib.rs index 6c74a5de2d808a..c4c0f8f9dd4295 100644 --- a/crates/turbopack-core/src/lib.rs +++ b/crates/turbopack-core/src/lib.rs @@ -13,6 +13,7 @@ pub mod chunk; pub mod code_builder; pub mod compile_time_info; pub mod context; +pub mod diagnostics; pub mod environment; pub mod error; pub mod file_source;