use crate::fleet_ensure::{
model::{EffectRecord, EffectState, EnsureAction, FleetEnsureStateRecord},
ops::{EffectObservation, EnsurePlatform, action_sha256},
};
pub(in crate::fleet_ensure) struct PreparedEffect {
pub record: EffectRecord,
pub observation: Option<EffectObservation>,
}
pub(in crate::fleet_ensure) fn prepare_effect<P: EnsurePlatform>(
platform: &mut P,
operation_id: &str,
action: &EnsureAction,
state: &FleetEnsureStateRecord,
) -> Result<PreparedEffect, P::Error> {
platform.with_activity(
crate::fleet_ensure::dto::FleetObservationStage::EffectPreparation,
|platform| {
platform.with_preparation_observations(action, |platform| {
let native_funding = matches!(action, EnsureAction::Fund { .. });
let pre_cycles = if native_funding {
None
} else {
platform.action_cycles(action, state)?
};
let destination_pre_cycles = platform.action_destination_cycles(action, state)?;
let pre_canister_version = platform.action_canister_version(action, state)?;
let mut record = EffectRecord {
publication_attempts: 0,
maintenance_attempts: 0,
action_sha256: action_sha256(action),
created_principal: None,
destination_post_cycles: destination_pre_cycles,
destination_pre_cycles,
post_cycles: None,
pre_cycles,
pre_canister_version,
progress_identity: None,
receipt: None,
state: EffectState::Intent,
};
let observation = if native_funding {
let observed = platform.observe_effect(operation_id, action, &record, state)?;
record.pre_cycles = observed.post_cycles;
Some(observed)
} else {
None
};
Ok(PreparedEffect {
record,
observation,
})
})
},
)
}