turbopack_core/chunk/
availability_info.rs

1use anyhow::Result;
2use turbo_tasks::{ResolvedVc, Vc};
3
4use super::available_modules::{AvailableModules, AvailableModulesSet};
5
6#[turbo_tasks::value(serialization = "auto_for_input")]
7#[derive(Hash, Clone, Copy, Debug)]
8pub enum AvailabilityInfo {
9    /// Availability of modules is not tracked
10    Untracked,
11    /// Availablility of modules is tracked, but no modules are available
12    Root,
13    /// There are modules already available.
14    Complete {
15        available_modules: ResolvedVc<AvailableModules>,
16    },
17}
18
19impl AvailabilityInfo {
20    pub fn available_modules(&self) -> Option<ResolvedVc<AvailableModules>> {
21        match self {
22            Self::Untracked => None,
23            Self::Root => None,
24            Self::Complete {
25                available_modules, ..
26            } => Some(*available_modules),
27        }
28    }
29
30    pub async fn with_modules(self, modules: Vc<AvailableModulesSet>) -> Result<Self> {
31        Ok(match self {
32            AvailabilityInfo::Untracked => AvailabilityInfo::Untracked,
33            AvailabilityInfo::Root => AvailabilityInfo::Complete {
34                available_modules: AvailableModules::new(modules).to_resolved().await?,
35            },
36            AvailabilityInfo::Complete { available_modules } => AvailabilityInfo::Complete {
37                available_modules: available_modules
38                    .with_modules(modules)
39                    .to_resolved()
40                    .await?,
41            },
42        })
43    }
44}