turbopack_core/chunk/
availability_info.rs

1use 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    /// There are modules already available.
22    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}