synwire_core/sandbox/
approval.rs1use crate::BoxFuture;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
8#[non_exhaustive]
9pub enum RiskLevel {
10 None,
12 Low,
14 Medium,
16 High,
18 Critical,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
24pub struct ApprovalRequest {
25 pub operation: String,
27 pub description: String,
29 pub risk: RiskLevel,
31 pub timeout_secs: Option<u64>,
33 pub context: serde_json::Value,
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
39#[non_exhaustive]
40pub enum ApprovalDecision {
41 Allow,
43 Deny,
45 AllowAlways,
47 Abort,
49 AllowModified {
51 modified_context: serde_json::Value,
53 },
54}
55
56pub trait ApprovalCallback: Send + Sync {
60 fn request(&self, req: ApprovalRequest) -> BoxFuture<'_, ApprovalDecision>;
62}
63
64#[derive(Debug, Clone, Default)]
66pub struct AutoApproveCallback;
67
68impl ApprovalCallback for AutoApproveCallback {
69 fn request(&self, _req: ApprovalRequest) -> BoxFuture<'_, ApprovalDecision> {
70 Box::pin(async { ApprovalDecision::Allow })
71 }
72}
73
74#[derive(Debug, Clone, Default)]
76pub struct AutoDenyCallback;
77
78impl ApprovalCallback for AutoDenyCallback {
79 fn request(&self, _req: ApprovalRequest) -> BoxFuture<'_, ApprovalDecision> {
80 Box::pin(async { ApprovalDecision::Deny })
81 }
82}