@@ -52,7 +52,7 @@ impl<T: RuntimeFactors, U: Send + 'static> FactorsExecutor<T, U> {
52
52
self : Arc < Self > ,
53
53
app : App ,
54
54
runtime_config : T :: RuntimeConfig ,
55
- component_loader : & impl ComponentLoader ,
55
+ component_loader : & impl ComponentLoader < T , U > ,
56
56
) -> anyhow:: Result < FactorsExecutorApp < T , U > > {
57
57
let configured_app = self
58
58
. factors
@@ -63,15 +63,14 @@ impl<T: RuntimeFactors, U: Send + 'static> FactorsExecutor<T, U> {
63
63
hooks. configure_app ( & configured_app) . await ?;
64
64
}
65
65
66
- let mut component_instance_pres = HashMap :: new ( ) ;
66
+ let components = configured_app. app ( ) . components ( ) ;
67
+ let mut component_instance_pres = HashMap :: with_capacity ( components. len ( ) ) ;
67
68
68
- for app_component in configured_app . app ( ) . components ( ) {
69
- let component = component_loader
70
- . load_component ( self . core_engine . as_ref ( ) , & app_component )
69
+ for component in components {
70
+ let instance_pre = component_loader
71
+ . load_instance_pre ( & self . core_engine , & component )
71
72
. await ?;
72
- let instance_pre = self . core_engine . instantiate_pre ( & component) ?;
73
-
74
- component_instance_pres. insert ( app_component. id ( ) . to_string ( ) , instance_pre) ;
73
+ component_instance_pres. insert ( component. id ( ) . to_string ( ) , instance_pre) ;
75
74
}
76
75
77
76
Ok ( FactorsExecutorApp {
@@ -102,13 +101,23 @@ where
102
101
103
102
/// A ComponentLoader is responsible for loading Wasmtime [`Component`]s.
104
103
#[ async_trait]
105
- pub trait ComponentLoader {
104
+ pub trait ComponentLoader < T : RuntimeFactors , U > : Sync {
106
105
/// Loads a [`Component`] for the given [`AppComponent`].
107
106
async fn load_component (
108
107
& self ,
109
108
engine : & spin_core:: wasmtime:: Engine ,
110
109
component : & AppComponent ,
111
110
) -> anyhow:: Result < Component > ;
111
+
112
+ /// Loads [`InstancePre`] for the given [`AppComponent`].
113
+ async fn load_instance_pre (
114
+ & self ,
115
+ engine : & spin_core:: Engine < InstanceState < T :: InstanceState , U > > ,
116
+ component : & AppComponent ,
117
+ ) -> anyhow:: Result < spin_core:: InstancePre < InstanceState < T :: InstanceState , U > > > {
118
+ let component = self . load_component ( engine. as_ref ( ) , component) . await ?;
119
+ engine. instantiate_pre ( & component)
120
+ }
112
121
}
113
122
114
123
type InstancePre < T , U > =
@@ -344,7 +353,7 @@ mod tests {
344
353
struct DummyComponentLoader ;
345
354
346
355
#[ async_trait]
347
- impl ComponentLoader for DummyComponentLoader {
356
+ impl ComponentLoader < TestFactors , ( ) > for DummyComponentLoader {
348
357
async fn load_component (
349
358
& self ,
350
359
engine : & spin_core:: wasmtime:: Engine ,
0 commit comments