use crate::core::types::{PlanAction, ResourceType};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ProofObligation {
Idempotent,
Monotonic,
Convergent,
Destructive,
}
pub fn classify(rtype: &ResourceType, action: &PlanAction) -> ProofObligation {
match action {
PlanAction::NoOp => ProofObligation::Idempotent,
PlanAction::Create => classify_create(rtype),
PlanAction::Update => classify_update(rtype),
PlanAction::Destroy => classify_destroy(rtype),
}
}
fn classify_create(rtype: &ResourceType) -> ProofObligation {
match rtype {
ResourceType::File => ProofObligation::Idempotent,
ResourceType::Package => ProofObligation::Idempotent,
ResourceType::Service => ProofObligation::Convergent,
ResourceType::Mount => ProofObligation::Idempotent,
ResourceType::User => ProofObligation::Idempotent,
ResourceType::Cron => ProofObligation::Idempotent,
ResourceType::Network => ProofObligation::Convergent,
ResourceType::Docker | ResourceType::Pepita => ProofObligation::Convergent,
ResourceType::Gpu => ProofObligation::Convergent,
ResourceType::Model => ProofObligation::Monotonic,
ResourceType::Recipe => ProofObligation::Convergent,
ResourceType::Task => ProofObligation::Convergent,
ResourceType::WasmBundle | ResourceType::Image => ProofObligation::Idempotent,
ResourceType::Build => ProofObligation::Convergent,
ResourceType::GithubRelease => ProofObligation::Idempotent,
}
}
fn classify_update(rtype: &ResourceType) -> ProofObligation {
match rtype {
ResourceType::File => ProofObligation::Idempotent,
ResourceType::Package => ProofObligation::Convergent,
ResourceType::Service => ProofObligation::Convergent,
_ => ProofObligation::Convergent,
}
}
fn classify_destroy(rtype: &ResourceType) -> ProofObligation {
match rtype {
ResourceType::Service => ProofObligation::Convergent,
ResourceType::Package => ProofObligation::Convergent,
ResourceType::Cron => ProofObligation::Idempotent,
ResourceType::Mount => ProofObligation::Convergent,
ResourceType::File => ProofObligation::Destructive,
ResourceType::User => ProofObligation::Destructive,
ResourceType::Model => ProofObligation::Destructive,
ResourceType::Docker | ResourceType::Pepita => ProofObligation::Convergent,
ResourceType::Network => ProofObligation::Convergent,
ResourceType::Gpu => ProofObligation::Convergent,
ResourceType::Recipe => ProofObligation::Convergent,
ResourceType::Task => ProofObligation::Destructive,
ResourceType::WasmBundle | ResourceType::Image => ProofObligation::Destructive,
ResourceType::Build => ProofObligation::Convergent,
ResourceType::GithubRelease => ProofObligation::Convergent,
}
}
pub fn label(po: &ProofObligation) -> &'static str {
match po {
ProofObligation::Idempotent => "idempotent",
ProofObligation::Monotonic => "monotonic",
ProofObligation::Convergent => "convergent",
ProofObligation::Destructive => "destructive",
}
}
pub fn is_safe(po: &ProofObligation) -> bool {
matches!(
po,
ProofObligation::Idempotent | ProofObligation::Monotonic | ProofObligation::Convergent
)
}