use candid::CandidType;
use serde::{Deserialize, Serialize};
#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum ProvisioningFailureStage {
Provisioning,
CoordinatorStatus,
ComponentOrigin,
ComponentAllocation,
ComponentChildAllocation,
ComponentRuntime,
ComponentMembership,
ComponentCommit,
RootPreparation,
RootActivation,
StoreCatalog,
StoreStatus,
StoreIdentity,
StoreCredential,
StoreActivation,
}
#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum ProvisioningRetryCategory {
Backoff,
ReviewRequired,
}
pub const MAX_PROVISIONING_BACKOFF_SECONDS: u64 = 60;
#[must_use]
pub fn retry_delay_seconds(category: ProvisioningRetryCategory, failures: u32) -> Option<u64> {
if matches!(category, ProvisioningRetryCategory::ReviewRequired) {
None
} else {
Some((1_u64 << failures.saturating_sub(1).min(6)).min(MAX_PROVISIONING_BACKOFF_SECONDS))
}
}