Skip to main content

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_bridge::StatefulServiceFactoryBridge,
9    stateful_traits::IStatefulServiceFactory, stateless_bridge::StatelessServiceFactoryBridge,
10    stateless_traits::IStatelessServiceFactory,
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(
30        &self,
31        servicetypename: &WString,
32        factory: Box<dyn IStatelessServiceFactory>,
33    ) -> crate::Result<()> {
34        let rt_cp = self.rt.clone();
35        let bridge: IFabricStatelessServiceFactory =
36            StatelessServiceFactoryBridge::create(factory, rt_cp).into();
37        unsafe {
38            self.com_impl
39                .RegisterStatelessServiceFactory(servicetypename.as_pcwstr(), &bridge)
40        }
41        .map_err(crate::Error::from)
42    }
43
44    pub fn register_stateful_service_factory(
45        &self,
46        servicetypename: &WString,
47        factory: Box<dyn IStatefulServiceFactory>,
48    ) -> crate::Result<()> {
49        let rt_cp = self.rt.clone();
50        let bridge: IFabricStatefulServiceFactory =
51            StatefulServiceFactoryBridge::create(factory, rt_cp).into();
52        unsafe {
53            self.com_impl
54                .RegisterStatefulServiceFactory(servicetypename.as_pcwstr(), &bridge)
55        }
56        .map_err(crate::Error::from)
57    }
58}