turbopack_core/issue/
analyze.rs

1use 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}