use crate::BoxFuture;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[non_exhaustive]
pub enum RiskLevel {
None,
Low,
Medium,
High,
Critical,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApprovalRequest {
pub operation: String,
pub description: String,
pub risk: RiskLevel,
pub timeout_secs: Option<u64>,
pub context: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub enum ApprovalDecision {
Allow,
Deny,
AllowAlways,
Abort,
AllowModified {
modified_context: serde_json::Value,
},
}
pub trait ApprovalCallback: Send + Sync {
fn request(&self, req: ApprovalRequest) -> BoxFuture<'_, ApprovalDecision>;
}
#[derive(Debug, Clone, Default)]
pub struct AutoApproveCallback;
impl ApprovalCallback for AutoApproveCallback {
fn request(&self, _req: ApprovalRequest) -> BoxFuture<'_, ApprovalDecision> {
Box::pin(async { ApprovalDecision::Allow })
}
}
#[derive(Debug, Clone, Default)]
pub struct AutoDenyCallback;
impl ApprovalCallback for AutoDenyCallback {
fn request(&self, _req: ApprovalRequest) -> BoxFuture<'_, ApprovalDecision> {
Box::pin(async { ApprovalDecision::Deny })
}
}