turbopack_core/chunk/
availability_info.rs

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