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(path: FileSystemPath, content: ResolvedVc<AssetContent>) -> Result<Vc<Self>> {
22        Ok(Self::cell(VirtualSource {
23            ident: AssetIdent::from_path(path).to_resolved().await?,
24            content,
25        }))
26    }
27
28    #[turbo_tasks::function]
29    pub fn new_with_ident(
30        ident: ResolvedVc<AssetIdent>,
31        content: ResolvedVc<AssetContent>,
32    ) -> Vc<Self> {
33        Self::cell(VirtualSource { ident, content })
34    }
35}
36
37#[turbo_tasks::value_impl]
38impl Source for VirtualSource {
39    #[turbo_tasks::function]
40    fn ident(&self) -> Vc<AssetIdent> {
41        *self.ident
42    }
43}
44
45#[turbo_tasks::value_impl]
46impl Asset for VirtualSource {
47    #[turbo_tasks::function]
48    fn content(&self) -> Vc<AssetContent> {
49        *self.content
50    }
51}