Skip to main content

turbopack_core/
virtual_source.rs

1use anyhow::Result;
2use turbo_rcstr::RcStr;
3use turbo_tasks::{ResolvedVc, ValueToString, Vc};
4use turbo_tasks_fs::FileSystemPath;
5
6use crate::{
7    asset::{Asset, AssetContent},
8    ident::AssetIdent,
9    source::Source,
10};
11
12/// A [Source] that is created from some passed source code.
13#[turbo_tasks::value]
14pub struct VirtualSource {
15    pub ident: ResolvedVc<AssetIdent>,
16    pub content: ResolvedVc<AssetContent>,
17}
18
19#[turbo_tasks::value_impl]
20impl VirtualSource {
21    #[turbo_tasks::function]
22    pub async fn new(path: FileSystemPath, content: ResolvedVc<AssetContent>) -> Result<Vc<Self>> {
23        Ok(Self::cell(VirtualSource {
24            ident: AssetIdent::from_path(path).to_resolved().await?,
25            content,
26        }))
27    }
28
29    #[turbo_tasks::function]
30    pub fn new_with_ident(
31        ident: ResolvedVc<AssetIdent>,
32        content: ResolvedVc<AssetContent>,
33    ) -> Vc<Self> {
34        Self::cell(VirtualSource { ident, content })
35    }
36}
37
38#[turbo_tasks::value_impl]
39impl Source for VirtualSource {
40    #[turbo_tasks::function]
41    fn ident(&self) -> Vc<AssetIdent> {
42        *self.ident
43    }
44
45    #[turbo_tasks::function]
46    async fn description(&self) -> Result<Vc<RcStr>> {
47        let ident = self.ident.to_string().await?;
48        Ok(Vc::cell(format!("virtual source {}", ident).into()))
49    }
50}
51
52#[turbo_tasks::value_impl]
53impl Asset for VirtualSource {
54    #[turbo_tasks::function]
55    fn content(&self) -> Vc<AssetContent> {
56        *self.content
57    }
58}