use ic_cdk::api::management_canister::main::{CanisterIdRecord, CanisterInfoRequest};
use crate::identity::CanisterId;
use super::{unwrap_call_result, CallError};
pub type CanisterStatusResult = ic_cdk::api::management_canister::main::CanisterStatusResponse;
pub type CanisterInfoResult = ic_cdk::api::management_canister::main::CanisterInfoResponse;
pub async fn canister_status(canister_id: CanisterId) -> CanisterStatusResult {
let response =
ic_cdk::api::management_canister::main::canister_status(CanisterIdRecord { canister_id })
.await
.unwrap()
.0;
response
}
pub async fn canister_info(
canister_id: CanisterId,
num_requested_changes: Option<u64>,
) -> CanisterInfoResult {
let response = ic_cdk::api::management_canister::main::canister_info(CanisterInfoRequest {
canister_id,
num_requested_changes,
})
.await
.unwrap()
.0;
response
}
pub async fn start_canister(canister_id: CanisterId) -> Result<(), String> {
let call_result =
ic_cdk::api::management_canister::main::start_canister(CanisterIdRecord { canister_id })
.await;
if call_result.is_err() {
let err = call_result.unwrap_err();
return Result::Err(format!(
"canister: {} start_canister failed: {:?} {}",
canister_id.to_text(),
err.0,
err.1
));
}
Result::Ok(())
}
pub async fn stop_canister(canister_id: CanisterId) -> Result<(), String> {
let call_result =
ic_cdk::api::management_canister::main::stop_canister(CanisterIdRecord { canister_id })
.await;
if call_result.is_err() {
let err = call_result.unwrap_err();
return Result::Err(format!(
"canister: {} stop_canister failed: {:?} {}",
canister_id.to_text(),
err.0,
err.1
));
}
Result::Ok(())
}
pub async fn delete_canister(canister_id: CanisterId) -> Result<(), String> {
let call_result =
ic_cdk::api::management_canister::main::delete_canister(CanisterIdRecord { canister_id })
.await;
if call_result.is_err() {
let err = call_result.unwrap_err();
return Result::Err(format!(
"canister: {} delete_canister failed: {:?} {}",
canister_id.to_text(),
err.0,
err.1
));
}
Result::Ok(())
}
pub async fn call_canister_status(canister_id: &CanisterId) -> CanisterStatusResult {
let call_result: Result<(CanisterStatusResult,), CallError> =
ic_cdk::call(canister_id.clone(), "canister_status", ()).await;
unwrap_call_result(canister_id, "canister_status", call_result)
}