turbopack_core/issue/
analyze.rs1use anyhow::Result;
2use turbo_rcstr::RcStr;
3use turbo_tasks::{ResolvedVc, Vc};
4use turbo_tasks_fs::FileSystemPath;
5
6use super::{Issue, IssueSeverity, IssueSource, IssueStage, OptionStyledString, StyledString};
7use crate::{ident::AssetIdent, issue::OptionIssueSource};
8
9#[turbo_tasks::value(shared)]
10pub struct AnalyzeIssue {
11 pub severity: IssueSeverity,
12 pub source_ident: ResolvedVc<AssetIdent>,
13 pub title: ResolvedVc<RcStr>,
14 pub message: ResolvedVc<StyledString>,
15 pub code: Option<RcStr>,
16 pub source: Option<IssueSource>,
17}
18
19#[turbo_tasks::value_impl]
20impl AnalyzeIssue {
21 #[turbo_tasks::function]
22 pub fn new(
23 severity: IssueSeverity,
24 source_ident: ResolvedVc<AssetIdent>,
25 title: ResolvedVc<RcStr>,
26 message: ResolvedVc<StyledString>,
27 code: Option<RcStr>,
28 source: Option<IssueSource>,
29 ) -> Vc<Self> {
30 Self {
31 severity,
32 source_ident,
33 title,
34 message,
35 code,
36 source,
37 }
38 .cell()
39 }
40}
41
42#[turbo_tasks::value_impl]
43impl Issue for AnalyzeIssue {
44 fn severity(&self) -> IssueSeverity {
45 self.severity
46 }
47
48 #[turbo_tasks::function]
49 async fn title(&self) -> Result<Vc<StyledString>> {
50 let title = &**self.title.await?;
51 Ok(if let Some(code) = self.code.as_ref() {
52 StyledString::Line(vec![
53 StyledString::Strong(code.clone()),
54 StyledString::Text(" ".into()),
55 StyledString::Text(title.into()),
56 ])
57 } else {
58 StyledString::Text(title.into())
59 }
60 .cell())
61 }
62
63 #[turbo_tasks::function]
64 fn stage(&self) -> Vc<IssueStage> {
65 IssueStage::Analysis.cell()
66 }
67
68 #[turbo_tasks::function]
69 fn file_path(&self) -> Vc<FileSystemPath> {
70 self.source_ident.path()
71 }
72
73 #[turbo_tasks::function]
74 fn description(&self) -> Vc<OptionStyledString> {
75 Vc::cell(Some(self.message))
76 }
77
78 #[turbo_tasks::function]
79 async fn source(&self) -> Vc<OptionIssueSource> {
80 Vc::cell(self.source)
81 }
82}