use mssf_core::{
GUID, WString,
runtime::{IStatelessServiceFactory, IStatelessServiceInstance},
types::{ServicePartitionInformation, Uri},
};
use crate::mock::StatelessServicePartitionMock;
pub struct StatelessServiceInstanceDriver {
service_factory: Box<dyn IStatelessServiceFactory>,
instance: Option<Box<dyn IStatelessServiceInstance>>,
}
impl StatelessServiceInstanceDriver {
pub fn new(service_factory: Box<dyn IStatelessServiceFactory>) -> Self {
Self {
service_factory,
instance: None,
}
}
}
pub struct CreateStatelessServiceArg {
pub init_data: Vec<u8>,
pub partition_id: GUID,
pub instance_id: i64, pub service_name: Uri,
pub service_type_name: WString,
}
impl StatelessServiceInstanceDriver {
pub async fn create_service_instance(
&mut self,
desc: &CreateStatelessServiceArg,
) -> mssf_core::Result<()> {
let service_instance = self
.service_factory
.create_instance(
desc.service_type_name.clone(),
desc.service_name.clone(),
&desc.init_data,
desc.partition_id,
desc.instance_id,
)
.inspect_err(|e| {
tracing::error!("Failed to create stateless service instance: {:?}", e)
})?;
let prev = self.instance.replace(service_instance);
assert!(prev.is_none(), "Service instance already exists");
let cancellation_token = mssf_core::sync::SimpleCancelToken::new_boxed();
let instance_ref = self.instance.as_ref().unwrap();
let partition =
StatelessServicePartitionMock::new_arc(ServicePartitionInformation::Singleton(
mssf_core::types::SingletonPartitionInformation {
id: desc.partition_id,
},
));
instance_ref.open(partition, cancellation_token).await?;
Ok(())
}
pub async fn delete_service_instance(&mut self) -> mssf_core::Result<()> {
if let Some(instance) = self.instance.take() {
let cancellation_token = mssf_core::sync::SimpleCancelToken::new_boxed();
instance.close(cancellation_token).await?;
}
Ok(())
}
pub fn delete_service_instance_force(&mut self) {
if let Some(instance) = self.instance.take() {
instance.abort();
}
}
}