use std::sync::Arc;
use crate::WString;
use crate::runtime::executor::BoxedCancelToken;
use crate::types::{
SelfReconfiguringConfigurationChangeRequest, SelfReconfiguringConfigurationReport,
SelfReconfiguringConfigurationRequest, SelfReconfiguringOpenMode, ServicePartitionInformation,
};
pub trait ISelfReconfiguringServiceFactory: Send + Sync + 'static {
fn create_instance(
&self,
servicetypename: WString,
servicename: crate::types::Uri,
initializationdata: &[u8],
partitionid: crate::GUID,
instanceid: i64,
) -> crate::Result<Box<dyn ISelfReconfiguringServiceInstance>>;
}
#[async_trait::async_trait]
pub trait ISelfReconfiguringServiceInstance: Send + Sync + 'static {
async fn open(
&self,
partition: Arc<dyn ISelfReconfiguringServicePartition>,
open_mode: SelfReconfiguringOpenMode,
cancellation_token: BoxedCancelToken,
) -> crate::Result<WString>;
fn request_configuration(
&self,
request: SelfReconfiguringConfigurationRequest,
) -> crate::Result<()>;
fn request_configuration_change(
&self,
change: SelfReconfiguringConfigurationChangeRequest,
) -> crate::Result<()>;
async fn close(&self, cancellation_token: BoxedCancelToken) -> crate::Result<()>;
fn abort(&self);
}
pub trait ISelfReconfiguringServicePartition: Send + Sync + 'static {
fn get_partition_info(&self) -> crate::Result<ServicePartitionInformation>;
fn report_load(&self, metrics: &[crate::types::LoadMetric]) -> crate::Result<()>;
fn report_fault(&self, fault_type: crate::types::FaultType) -> crate::Result<()>;
fn report_move_cost(&self, move_cost: crate::types::MoveCost) -> crate::Result<()>;
fn report_instance_health(
&self,
health_info: &crate::types::HealthInformation,
) -> crate::Result<()>;
fn report_partition_health(
&self,
health_info: &crate::types::HealthInformation,
) -> crate::Result<()>;
fn report_configuration(
&self,
report: &SelfReconfiguringConfigurationReport,
) -> crate::Result<()>;
}