use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApprovalGate {
pub id: String,
pub step_id: String,
pub workflow_id: String,
pub approver_chain: Vec<Approver>,
pub condition: Option<ConditionalApproval>,
pub timeout: Option<TimeBoundApproval>,
pub delegation: Option<DelegationRule>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Approver {
pub identity: String,
pub role: Option<String>,
pub priority: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConditionalApproval {
pub expression: String,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeBoundApproval {
pub timeout_ms: u64,
pub on_timeout: TimeoutAction,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TimeoutAction {
AutoApprove,
AutoDeny,
Escalate,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DelegationRule {
pub delegate_to: String,
pub condition: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PendingApproval {
pub gate_id: String,
pub execution_id: String,
pub step_id: String,
pub requested_at: DateTime<Utc>,
pub expires_at: Option<DateTime<Utc>>,
pub current_approver: String,
pub context: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApprovalReceipt {
pub gate_id: String,
pub execution_id: String,
pub decision: ApprovalDecision,
pub decided_by: String,
pub decided_at: DateTime<Utc>,
pub reason: Option<String>,
pub checksum: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ApprovalDecision {
Approved,
Denied,
Escalated,
TimedOut,
Delegated { to: String },
}