use super::event_adapter::{PlanApprovalState, WorkflowSession, WorkflowSnapshot};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(super) enum ConfirmKind {
StartPlan,
ContinueResume,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(super) struct ControlPolicy {
pub(super) can_leave: bool,
pub(super) cancel_plain_c: bool,
pub(super) cancel_on_interrupt: bool,
pub(super) confirm: Option<ConfirmKind>,
pub(super) show_leave_hint: bool,
}
pub(super) fn control_policy(
session: WorkflowSession,
snapshot: &WorkflowSnapshot,
) -> ControlPolicy {
let live = snapshot.lifecycle.is_live();
let approved = matches!(snapshot.approval, PlanApprovalState::Approved);
match session {
WorkflowSession::Watcher => ControlPolicy {
can_leave: true,
cancel_plain_c: live && approved,
cancel_on_interrupt: false,
confirm: None,
show_leave_hint: true,
},
WorkflowSession::Owner => ControlPolicy {
can_leave: !live,
cancel_plain_c: live && approved,
cancel_on_interrupt: live,
confirm: match snapshot.approval {
PlanApprovalState::AwaitingPlan => Some(ConfirmKind::StartPlan),
PlanApprovalState::AwaitingResume => Some(ConfirmKind::ContinueResume),
PlanApprovalState::Approved => None,
},
show_leave_hint: !live && approved,
},
}
}
#[cfg(test)]
#[path = "control_tests.rs"]
mod tests;