mssf_core/runtime/
runtime_wrapper.rs1use crate::WString;
2use mssf_com::FabricRuntime::{
4 IFabricRuntime, IFabricStatefulServiceFactory, IFabricStatelessServiceFactory,
5};
6
7use super::{
8 create_com_runtime, executor::Executor, stateful::StatefulServiceFactory,
9 stateful_bridge::StatefulServiceFactoryBridge, stateless::StatelessServiceFactory,
10 stateless_bridge::StatelessServiceFactoryBridge,
11};
12pub struct Runtime<E>
13where
14 E: Executor,
15{
16 com_impl: IFabricRuntime,
17 rt: E,
18}
19
20impl<E> Runtime<E>
21where
22 E: Executor,
23{
24 pub fn create(rt: E) -> crate::Result<Runtime<E>> {
25 let com = create_com_runtime()?;
26 Ok(Runtime { com_impl: com, rt })
27 }
28
29 pub fn register_stateless_service_factory<F>(
30 &self,
31 servicetypename: &WString,
32 factory: F,
33 ) -> crate::Result<()>
34 where
35 F: StatelessServiceFactory + 'static,
36 {
37 let rt_cp = self.rt.clone();
38 let bridge: IFabricStatelessServiceFactory =
39 StatelessServiceFactoryBridge::create(factory, rt_cp).into();
40 unsafe {
41 self.com_impl
42 .RegisterStatelessServiceFactory(servicetypename.as_pcwstr(), &bridge)
43 }
44 .map_err(crate::Error::from)
45 }
46
47 pub fn register_stateful_service_factory(
48 &self,
49 servicetypename: &WString,
50 factory: impl StatefulServiceFactory + 'static,
51 ) -> crate::Result<()> {
52 let rt_cp = self.rt.clone();
53 let bridge: IFabricStatefulServiceFactory =
54 StatefulServiceFactoryBridge::create(factory, rt_cp).into();
55 unsafe {
56 self.com_impl
57 .RegisterStatefulServiceFactory(servicetypename.as_pcwstr(), &bridge)
58 }
59 .map_err(crate::Error::from)
60 }
61}