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