use crate::engine_error::EngineError;
use crate::status::WorkflowStepStatus;
#[derive(Debug, Clone)]
pub enum GateApprovalState {
Pending,
Approved {
feedback: Option<String>,
selections: Option<Vec<String>>,
},
Rejected {
feedback: Option<String>,
},
}
pub fn gate_approval_state_from_fields(
approved_at: Option<&str>,
status: WorkflowStepStatus,
feedback: Option<String>,
selections: Option<Vec<String>>,
) -> GateApprovalState {
if approved_at.is_some() || status == WorkflowStepStatus::Completed {
return GateApprovalState::Approved {
feedback,
selections,
};
}
if status == WorkflowStepStatus::Failed {
return GateApprovalState::Rejected { feedback };
}
GateApprovalState::Pending
}
pub trait GateApprovalStore: Send + Sync {
fn get_gate_approval(&self, step_id: &str) -> Result<GateApprovalState, EngineError>;
fn approve_gate(
&self,
step_id: &str,
approved_by: &str,
feedback: Option<&str>,
selections: Option<&[String]>,
) -> Result<(), EngineError>;
fn reject_gate(
&self,
step_id: &str,
rejected_by: &str,
feedback: Option<&str>,
) -> Result<(), EngineError>;
}