1use turbo_rcstr::RcStr;
2use turbo_tasks::{ResolvedVc, TaskInput, ValueToString, Vc};
3
4use crate::{asset::Asset, 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,
19 SideEffectFree,
24 SideEffectful,
26}
27
28#[turbo_tasks::value_trait]
31pub trait Module: Asset {
32 #[turbo_tasks::function]
35 fn ident(&self) -> Vc<AssetIdent>;
36
37 #[turbo_tasks::function]
40 fn ident_string(self: Vc<Self>) -> Vc<RcStr> {
41 self.ident().to_string()
42 }
43
44 #[turbo_tasks::function]
46 fn source(&self) -> Vc<OptionSource>;
47
48 #[turbo_tasks::function]
51 fn references(self: Vc<Self>) -> Vc<ModuleReferences> {
52 ModuleReferences::empty()
53 }
54
55 #[turbo_tasks::function]
57 fn is_self_async(self: Vc<Self>) -> Vc<bool> {
58 Vc::cell(false)
59 }
60
61 #[turbo_tasks::function]
63 fn side_effects(self: Vc<Self>) -> Vc<ModuleSideEffects>;
64}
65
66#[turbo_tasks::value_trait]
67pub trait StyleModule: Module + Asset {
68 #[turbo_tasks::function]
70 fn style_type(&self) -> Vc<StyleType>;
71}
72
73#[turbo_tasks::value(transparent)]
74pub struct OptionModule(Option<ResolvedVc<Box<dyn Module>>>);
75
76#[turbo_tasks::value(transparent)]
77pub struct Modules(Vec<ResolvedVc<Box<dyn Module>>>);
78
79#[turbo_tasks::value_impl]
80impl Modules {
81 #[turbo_tasks::function]
82 pub fn empty() -> Vc<Self> {
83 Vc::cell(Vec::new())
84 }
85}