use crate::ArgentorResult;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum RiskLevel {
Low,
Medium,
High,
Critical,
}
impl RiskLevel {
pub fn parse_level(s: &str) -> Self {
match s.to_lowercase().as_str() {
"low" => RiskLevel::Low,
"medium" => RiskLevel::Medium,
"high" => RiskLevel::High,
"critical" => RiskLevel::Critical,
_ => RiskLevel::Medium,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApprovalRequest {
pub task_id: String,
pub description: String,
pub risk_level: RiskLevel,
pub context: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApprovalDecision {
pub approved: bool,
pub reason: Option<String>,
pub reviewer: String,
}
#[async_trait]
pub trait ApprovalChannel: Send + Sync {
async fn request_approval(&self, request: ApprovalRequest) -> ArgentorResult<ApprovalDecision>;
}