turbopack_core/chunk/
availability_info.rs1use anyhow::Result;
2use bincode::{Decode, Encode};
3use bitfield::bitfield;
4use turbo_rcstr::RcStr;
5use turbo_tasks::{NonLocalValue, ResolvedVc, TaskInput, Vc, trace::TraceRawVcs};
6
7use crate::chunk::available_modules::{AvailableModules, AvailableModulesSet};
8
9bitfield! {
10 #[derive(Clone, Copy, Default, TaskInput, TraceRawVcs, NonLocalValue, PartialEq, Eq, Hash, Encode, Decode)]
11 pub struct AvailabilityFlags(u8);
12 impl Debug;
13 pub is_in_async_module, set_is_in_async_module: 0;
14}
15
16#[derive(
17 Eq, PartialEq, Hash, Clone, Copy, Debug, TaskInput, TraceRawVcs, NonLocalValue, Encode, Decode,
18)]
19pub struct AvailabilityInfo {
20 flags: AvailabilityFlags,
21 available_modules: Option<ResolvedVc<AvailableModules>>,
23}
24
25impl AvailabilityInfo {
26 pub fn root() -> Self {
27 Self {
28 flags: AvailabilityFlags::default(),
29 available_modules: None,
30 }
31 }
32
33 pub fn available_modules(&self) -> Option<ResolvedVc<AvailableModules>> {
34 self.available_modules
35 }
36
37 pub async fn with_modules(self, modules: Vc<AvailableModulesSet>) -> Result<Self> {
38 Ok(if let Some(available_modules) = self.available_modules {
39 Self {
40 flags: self.flags,
41 available_modules: Some(
42 available_modules
43 .with_modules(modules)
44 .to_resolved()
45 .await?,
46 ),
47 }
48 } else {
49 Self {
50 flags: self.flags,
51 available_modules: Some(AvailableModules::new(modules).to_resolved().await?),
52 }
53 })
54 }
55
56 pub fn in_async_module(self) -> Self {
57 let mut flags = self.flags;
58 flags.set_is_in_async_module(true);
59 Self {
60 flags,
61 available_modules: self.available_modules,
62 }
63 }
64
65 pub fn is_in_async_module(&self) -> bool {
66 self.flags.is_in_async_module()
67 }
68
69 pub async fn ident(&self) -> Result<Option<RcStr>> {
70 Ok(if let Some(available_modules) = self.available_modules {
71 Some(available_modules.hash().await?.to_string().into())
72 } else {
73 None
74 })
75 }
76}