use super::types::{
CanisterInstallMode, ChunkHash, InstallChunkedCodeArgs, InstallCodeArgs, UninstallCodeArgs, UpgradeFlags,
};
use crate::identity::CanisterId;
pub type CanisterCodeWasm = Vec<u8>;
pub type CanisterInitArg = Vec<u8>;
pub type CanisterCodeHash = Vec<u8>;
pub async fn install_code(
canister_id: CanisterId,
wasm_module: CanisterCodeWasm,
arg: CanisterInitArg,
) -> super::types::CanisterCallResult<()> {
let call_result = ic_cdk_management_canister::install_code(&InstallCodeArgs {
mode: CanisterInstallMode::Install,
canister_id,
wasm_module,
arg,
})
.await;
super::wrap_call_result(canister_id, "ic#install_code#install", call_result)
}
pub async fn upgrade_code(
canister_id: CanisterId,
wasm_module: CanisterCodeWasm,
arg: Option<CanisterInitArg>,
pre_upgrade: Option<UpgradeFlags>,
) -> super::types::CanisterCallResult<()> {
let call_result = ic_cdk_management_canister::install_code(&InstallCodeArgs {
mode: CanisterInstallMode::Upgrade(pre_upgrade),
canister_id,
wasm_module,
arg: arg.unwrap_or_default(),
})
.await;
super::wrap_call_result(canister_id, "ic#install_code#upgrade", call_result)
}
pub async fn reinstall_code(
canister_id: CanisterId,
wasm_module: CanisterCodeWasm,
arg: CanisterInitArg,
) -> super::types::CanisterCallResult<()> {
let call_result = ic_cdk_management_canister::install_code(&InstallCodeArgs {
mode: CanisterInstallMode::Reinstall,
canister_id,
wasm_module,
arg,
})
.await;
super::wrap_call_result(canister_id, "ic#install_code#reinstall", call_result)
}
pub async fn install_chunked_code(
target_canister: CanisterId,
mode: CanisterInstallMode,
store_canister: Option<CanisterId>,
chunk_hashes_list: Vec<ChunkHash>,
wasm_module_hash: CanisterCodeHash,
arg: CanisterInitArg,
) -> super::types::CanisterCallResult<()> {
let call_result = ic_cdk_management_canister::install_chunked_code(&InstallChunkedCodeArgs {
mode,
target_canister,
store_canister,
chunk_hashes_list,
wasm_module_hash,
arg,
})
.await;
super::wrap_call_result(target_canister, "ic#install_chunked_code", call_result)
}
pub async fn uninstall_code(canister_id: CanisterId) -> super::types::CanisterCallResult<()> {
let call_result = ic_cdk_management_canister::uninstall_code(&UninstallCodeArgs { canister_id }).await;
super::wrap_call_result(canister_id, "ic#uninstall_code", call_result)
}