use async_trait::async_trait;
use serde_json::Value;
#[derive(Debug, Clone)]
pub enum ApprovalDecision {
Allow,
Deny { reason: String },
}
#[async_trait]
pub trait ToolApprover: Send + Sync {
async fn approve(&self, tool_name: &str, args: &Value) -> ApprovalDecision;
}
pub struct AllowAllApprover;
#[async_trait]
impl ToolApprover for AllowAllApprover {
async fn approve(&self, _tool_name: &str, _args: &Value) -> ApprovalDecision {
ApprovalDecision::Allow
}
}
pub struct DenyAllApprover {
pub reason: String,
}
impl Default for DenyAllApprover {
fn default() -> Self {
Self { reason: "denied by policy".into() }
}
}
#[async_trait]
impl ToolApprover for DenyAllApprover {
async fn approve(&self, _tool_name: &str, _args: &Value) -> ApprovalDecision {
ApprovalDecision::Deny { reason: self.reason.clone() }
}
}