1
+ use std:: sync:: Arc ;
2
+
1
3
use anyhow;
2
4
3
- use super :: PluginContainer ;
4
- use super :: PluginContainerSync ;
5
5
use crate :: plugins:: resolver_javascript:: ResolverJavaScript ;
6
6
use crate :: plugins:: resolver_rpc:: ResolverAdapter ;
7
7
use crate :: plugins:: transformer_css:: TransformerCSS ;
@@ -10,54 +10,49 @@ use crate::plugins::transformer_html::TransformerHtml;
10
10
use crate :: plugins:: transformer_javascript:: TransformerJavaScript ;
11
11
use crate :: plugins:: transformer_json:: TransformerJson ;
12
12
use crate :: plugins:: transformer_rpc:: TransformerAdapter ;
13
- use crate :: public:: MachConfig ;
14
- use crate :: public:: Machrc ;
13
+ use crate :: public:: Compilation ;
15
14
use crate :: public:: Transformer ;
16
- use crate :: rpc:: RpcHosts ;
17
15
18
16
pub fn load_plugins (
19
- config : & MachConfig ,
20
- machrc : & Machrc ,
21
- adapter_map : & RpcHosts ,
22
- ) -> anyhow:: Result < PluginContainerSync > {
23
- let mut plugins = PluginContainer :: default ( ) ;
24
-
25
- if let Some ( resolvers) = & machrc. resolvers {
17
+ c : & mut Compilation ,
18
+ ) -> anyhow:: Result < ( ) > {
19
+ if let Some ( resolvers) = & c. machrc . resolvers {
26
20
for plugin_string in resolvers {
27
- let Some ( ( engine, specifier) ) = plugin_string. split_once ( ':' ) else {
28
- return Err ( anyhow:: anyhow!( format!(
29
- "Unable to parse engine:specifier for {}" ,
30
- plugin_string
31
- ) ) ) ;
32
- } ;
33
-
34
- if engine == "mach" && specifier == "resolver" {
35
- plugins. resolvers . push ( Box :: new ( ResolverJavaScript :: new ( ) ) ) ;
36
- continue ;
21
+ match plugin_string. as_str ( ) {
22
+ // Built-in
23
+ "mach:resolver" => {
24
+ c. plugins . resolvers . push ( Arc :: new ( ResolverJavaScript :: new ( ) ) ) ;
25
+ continue ;
26
+ }
27
+ // External
28
+ specifier => {
29
+ let Some ( ( engine, specifier) ) = specifier. split_once ( ':' ) else {
30
+ return Err ( anyhow:: anyhow!( format!(
31
+ "Unable to parse engine:specifier for {}" ,
32
+ plugin_string
33
+ ) ) ) ;
34
+ } ;
35
+
36
+ let Some ( adapter) = c. rpc_hosts . get ( engine) else {
37
+ return Err ( anyhow:: anyhow!( format!(
38
+ "No plugin runtime for engine: {}\n Cannot load plugin: {}" ,
39
+ engine, specifier
40
+ ) ) ) ;
41
+ } ;
42
+
43
+ c. plugins . resolvers . push ( Arc :: new ( ResolverAdapter :: new (
44
+ & c. config ,
45
+ specifier,
46
+ adapter. clone ( ) ,
47
+ ) ?) ) ;
48
+ }
37
49
}
38
-
39
- let Some ( adapter) = adapter_map. get ( engine) else {
40
- return Err ( anyhow:: anyhow!( format!(
41
- "No plugin runtime for engine: {}\n Cannot load plugin: {}" ,
42
- engine, specifier
43
- ) ) ) ;
44
- } ;
45
-
46
- adapter. start ( ) ?;
47
-
48
- plugins. resolvers . push ( Box :: new ( ResolverAdapter :: new (
49
- & * config,
50
- specifier,
51
- adapter. clone ( ) ,
52
- ) ?) ) ;
53
-
54
- continue ;
55
50
}
56
51
}
57
52
58
- if let Some ( transformers) = & machrc. transformers {
53
+ if let Some ( transformers) = & c . machrc . transformers {
59
54
for ( pattern, specifiers) in transformers {
60
- let mut transformers = Vec :: < Box < dyn Transformer > > :: new ( ) ;
55
+ let mut transformers = Vec :: < Arc < dyn Transformer > > :: new ( ) ;
61
56
62
57
for plugin_string in specifiers {
63
58
let Some ( ( engine, specifier) ) = plugin_string. split_once ( ':' ) else {
@@ -67,31 +62,31 @@ pub fn load_plugins(
67
62
) ) ) ;
68
63
} ;
69
64
if engine == "mach" && specifier == "transformer/javascript" {
70
- transformers. push ( Box :: new ( TransformerJavaScript { } ) ) ;
65
+ transformers. push ( Arc :: new ( TransformerJavaScript { } ) ) ;
71
66
continue ;
72
67
}
73
68
74
69
if engine == "mach" && specifier == "transformer/css" {
75
- transformers. push ( Box :: new ( TransformerCSS { } ) ) ;
70
+ transformers. push ( Arc :: new ( TransformerCSS { } ) ) ;
76
71
continue ;
77
72
}
78
73
79
74
if engine == "mach" && specifier == "transformer/html" {
80
- transformers. push ( Box :: new ( TransformerHtml { } ) ) ;
75
+ transformers. push ( Arc :: new ( TransformerHtml { } ) ) ;
81
76
continue ;
82
77
}
83
78
84
79
if engine == "mach" && specifier == "transformer/json" {
85
- transformers. push ( Box :: new ( TransformerJson { } ) ) ;
80
+ transformers. push ( Arc :: new ( TransformerJson { } ) ) ;
86
81
continue ;
87
82
}
88
83
89
84
if engine == "mach" && specifier == "transformer/drop" {
90
- transformers. push ( Box :: new ( TransformerDrop { } ) ) ;
85
+ transformers. push ( Arc :: new ( TransformerDrop { } ) ) ;
91
86
continue ;
92
87
}
93
88
94
- let Some ( adapter) = adapter_map . get ( engine) else {
89
+ let Some ( adapter) = c . rpc_hosts . get ( engine) else {
95
90
return Err ( anyhow:: anyhow!( format!(
96
91
"No plugin runtime for engine: {}\n Cannot load plugin: {}" ,
97
92
engine, specifier
@@ -100,18 +95,19 @@ pub fn load_plugins(
100
95
101
96
adapter. start ( ) ?;
102
97
103
- transformers. push ( Box :: new ( TransformerAdapter :: new (
104
- & * config,
98
+ transformers. push ( Arc :: new ( TransformerAdapter :: new (
99
+ & c . config ,
105
100
specifier,
106
101
adapter. clone ( ) ,
107
102
) ?) ) ;
108
103
}
109
104
110
- plugins
105
+ c . plugins
111
106
. transformers
112
107
. transformers
113
108
. insert ( pattern. clone ( ) , transformers) ;
114
109
}
115
110
}
116
- return Ok ( plugins. to_sync ( ) ) ;
111
+
112
+ return Ok ( ( ) ) ;
117
113
}
0 commit comments