turbopack_core/
virtual_source.rs1use 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#[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}