turbopack_core/
virtual_source.rs

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