use std::time::Duration;
use mssf_com::{
FabricClient::{IFabricApplicationManagementClient, IFabricApplicationUpgradeProgressResult2},
FabricTypes::FABRIC_URI,
};
use crate::{
runtime::executor::BoxedCancelToken,
sync::{FabricReceiver, fabric_begin_end_proxy},
types::{ApplicationUpgradeProgress, Uri},
};
#[derive(Debug, Clone)]
pub struct ApplicationManagementClient {
com: IFabricApplicationManagementClient,
}
impl From<IFabricApplicationManagementClient> for ApplicationManagementClient {
fn from(value: IFabricApplicationManagementClient) -> Self {
Self { com: value }
}
}
impl From<ApplicationManagementClient> for IFabricApplicationManagementClient {
fn from(value: ApplicationManagementClient) -> Self {
value.com
}
}
impl ApplicationManagementClient {
fn get_application_upgrade_progress_internal(
&self,
application_name: FABRIC_URI,
timeout_milliseconds: u32,
cancellation_token: Option<BoxedCancelToken>,
) -> FabricReceiver<crate::Result<IFabricApplicationUpgradeProgressResult2>> {
let com1 = &self.com;
let com2 = self.com.clone();
fabric_begin_end_proxy(
move |callback| unsafe {
com1.BeginGetApplicationUpgradeProgress(
application_name,
timeout_milliseconds,
callback,
)
},
move |ctx| unsafe { com2.EndGetApplicationUpgradeProgress(ctx) },
cancellation_token,
)
}
}
impl ApplicationManagementClient {
pub async fn get_application_upgrade_progress(
&self,
application_name: &Uri,
timeout: Duration,
cancellation_token: Option<BoxedCancelToken>,
) -> crate::Result<ApplicationUpgradeProgress> {
let com = self
.get_application_upgrade_progress_internal(
application_name.as_raw(),
timeout.as_millis().try_into().unwrap(),
cancellation_token,
)
.await??;
Ok(ApplicationUpgradeProgress::from(&com))
}
}