@@ -52,7 +52,7 @@ impl<T: RuntimeFactors, U: Send + 'static> FactorsExecutor<T, U> {
5252 self : Arc < Self > ,
5353 app : App ,
5454 runtime_config : T :: RuntimeConfig ,
55- component_loader : & impl ComponentLoader ,
55+ component_loader : & impl ComponentLoader < T , U > ,
5656 ) -> anyhow:: Result < FactorsExecutorApp < T , U > > {
5757 let configured_app = self
5858 . factors
@@ -63,15 +63,14 @@ impl<T: RuntimeFactors, U: Send + 'static> FactorsExecutor<T, U> {
6363 hooks. configure_app ( & configured_app) . await ?;
6464 }
6565
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 ( ) ) ;
6768
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 )
7172 . 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) ;
7574 }
7675
7776 Ok ( FactorsExecutorApp {
@@ -102,13 +101,23 @@ where
102101
103102/// A ComponentLoader is responsible for loading Wasmtime [`Component`]s.
104103#[ async_trait]
105- pub trait ComponentLoader {
104+ pub trait ComponentLoader < T : RuntimeFactors , U > : Sync {
106105 /// Loads a [`Component`] for the given [`AppComponent`].
107106 async fn load_component (
108107 & self ,
109108 engine : & spin_core:: wasmtime:: Engine ,
110109 component : & AppComponent ,
111110 ) -> 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+ }
112121}
113122
114123type InstancePre < T , U > =
@@ -344,7 +353,7 @@ mod tests {
344353 struct DummyComponentLoader ;
345354
346355 #[ async_trait]
347- impl ComponentLoader for DummyComponentLoader {
356+ impl ComponentLoader < TestFactors , ( ) > for DummyComponentLoader {
348357 async fn load_component (
349358 & self ,
350359 engine : & spin_core:: wasmtime:: Engine ,
0 commit comments