11use anyhow:: Result ;
2+ use bitfield:: bitfield;
23use serde:: { Deserialize , Serialize } ;
4+ use turbo_rcstr:: RcStr ;
35use turbo_tasks:: { NonLocalValue , ResolvedVc , TaskInput , Vc , trace:: TraceRawVcs } ;
46
57use super :: available_modules:: { AvailableModules , AvailableModulesSet } ;
68
9+ bitfield ! {
10+ #[ derive( Clone , Copy , Default , TaskInput , TraceRawVcs , NonLocalValue , Serialize , Deserialize , PartialEq , Eq , Hash ) ]
11+ pub struct AvailabilityFlags ( u8 ) ;
12+ impl Debug ;
13+ }
14+
715#[ derive(
816 Eq ,
917 PartialEq ,
@@ -17,40 +25,48 @@ use super::available_modules::{AvailableModules, AvailableModulesSet};
1725 Serialize ,
1826 Deserialize ,
1927) ]
20- pub enum AvailabilityInfo {
21- /// Availability of modules is not tracked
22- Untracked ,
23- /// Availability of modules is tracked, but no modules are available
24- Root ,
28+ pub struct AvailabilityInfo {
29+ flags : AvailabilityFlags ,
2530 /// There are modules already available.
26- Complete {
27- available_modules : ResolvedVc < AvailableModules > ,
28- } ,
31+ available_modules : Option < ResolvedVc < AvailableModules > > ,
2932}
3033
3134impl 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) ,
35+ pub fn root ( ) -> Self {
36+ Self {
37+ flags : AvailabilityFlags :: default ( ) ,
38+ available_modules : None ,
3939 }
4040 }
4141
42+ pub fn available_modules ( & self ) -> Option < ResolvedVc < AvailableModules > > {
43+ self . available_modules
44+ }
45+
4246 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- } ,
47+ Ok ( if let Some ( available_modules) = self . available_modules {
48+ Self {
49+ flags : self . flags ,
50+ available_modules : Some (
51+ available_modules
52+ . with_modules ( modules)
53+ . to_resolved ( )
54+ . await ?,
55+ ) ,
56+ }
57+ } else {
58+ Self {
59+ flags : self . flags ,
60+ available_modules : Some ( AvailableModules :: new ( modules) . to_resolved ( ) . await ?) ,
61+ }
62+ } )
63+ }
64+
65+ pub async fn ident ( & self ) -> Result < Option < RcStr > > {
66+ Ok ( if let Some ( available_modules) = self . available_modules {
67+ Some ( available_modules. hash ( ) . await ?. to_string ( ) . into ( ) )
68+ } else {
69+ None
5470 } )
5571 }
5672}
0 commit comments