mssf_core/runtime/
runtime_wrapper.rs

1use crate::WString;
2/// safe wrapping for runtime
3use 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}