1use turbo_rcstr::RcStr;
2use turbo_tasks::{ResolvedVc, TaskInput, ValueToString, Vc};
3
4use crate::{ident::AssetIdent, reference::ModuleReferences, source::OptionSource};
5
6#[derive(Clone, Copy, Debug, TaskInput, Hash)]
7#[turbo_tasks::value(shared)]
8pub enum StyleType {
9 IsolatedStyle,
10 GlobalStyle,
11}
12
13#[derive(Hash, Debug, Copy, Clone)]
14#[turbo_tasks::value(shared)]
15pub enum ModuleSideEffects {
16 ModuleEvaluationIsSideEffectFree,
22 SideEffectFree,
30 SideEffectful,
32}
33
34#[turbo_tasks::value_trait]
37pub trait Module {
38 #[turbo_tasks::function]
41 fn ident(&self) -> Vc<AssetIdent>;
42
43 #[turbo_tasks::function]
46 fn ident_string(self: Vc<Self>) -> Vc<RcStr> {
47 self.ident().to_string()
48 }
49
50 #[turbo_tasks::function]
52 fn source(&self) -> Vc<OptionSource>;
53
54 #[turbo_tasks::function]
57 fn references(self: Vc<Self>) -> Vc<ModuleReferences> {
58 ModuleReferences::empty()
59 }
60
61 #[turbo_tasks::function]
63 fn is_self_async(self: Vc<Self>) -> Vc<bool> {
64 Vc::cell(false)
65 }
66
67 #[turbo_tasks::function]
69 fn side_effects(self: Vc<Self>) -> Vc<ModuleSideEffects>;
70}
71
72#[turbo_tasks::value_trait]
73pub trait StyleModule: Module {
74 #[turbo_tasks::function]
76 fn style_type(&self) -> Vc<StyleType>;
77}
78
79#[turbo_tasks::value(transparent)]
80pub struct OptionModule(Option<ResolvedVc<Box<dyn Module>>>);
81
82#[turbo_tasks::value(transparent)]
83pub struct Modules(Vec<ResolvedVc<Box<dyn Module>>>);
84
85#[turbo_tasks::value_impl]
86impl Modules {
87 #[turbo_tasks::function]
88 pub fn empty() -> Vc<Self> {
89 Vc::cell(Vec::new())
90 }
91}