use crate::{
InternalError,
cdk::{candid::CandidType, types::Principal},
ops::{
cost_guard::CostGuardPermit,
ic::mgmt::MgmtOps,
runtime::install_source::{ApprovedModulePayload, ApprovedModuleSource},
},
};
pub struct ModuleInstallWorkflow;
impl ModuleInstallWorkflow {
pub async fn install_with_payload_with_permit<P: CandidType>(
permit: &CostGuardPermit,
target_canister: Principal,
source: &ApprovedModuleSource,
payload: P,
extra_arg: Option<Vec<u8>>,
) -> Result<(), InternalError> {
match source.payload() {
ApprovedModulePayload::Chunked {
source_canister,
chunk_hashes,
} => {
MgmtOps::install_chunked_code_with_permit(
permit,
target_canister,
*source_canister,
chunk_hashes.clone(),
source.module_hash().to_vec(),
(payload, extra_arg),
)
.await
}
ApprovedModulePayload::Embedded { wasm_module } => {
MgmtOps::install_code_with_permit(
permit,
target_canister,
wasm_module.as_ref().to_vec(),
(payload, extra_arg),
)
.await
}
}
}
}