pmcp_code_mode/policy/
mod.rs1pub mod types;
8
9#[cfg(feature = "cedar")]
10pub mod cedar;
11
12pub use types::*;
13
14#[derive(Debug, thiserror::Error)]
16pub enum PolicyEvaluationError {
17 #[error("Policy configuration error: {0}")]
18 ConfigError(String),
19
20 #[error("Policy evaluation error: {0}")]
21 EvaluationError(String),
22
23 #[error("Authorization denied: {0}")]
24 Denied(String),
25}
26
27#[async_trait::async_trait]
34pub trait PolicyEvaluator: Send + Sync {
35 async fn evaluate_operation(
37 &self,
38 operation: &OperationEntity,
39 server_config: &ServerConfigEntity,
40 ) -> Result<AuthorizationDecision, PolicyEvaluationError>;
41
42 #[cfg(feature = "openapi-code-mode")]
45 async fn evaluate_script(
46 &self,
47 _script: &ScriptEntity,
48 _server: &OpenAPIServerEntity,
49 ) -> Result<AuthorizationDecision, PolicyEvaluationError> {
50 Ok(AuthorizationDecision {
51 allowed: false,
52 determining_policies: vec!["default_deny_scripts".to_string()],
53 errors: vec!["Script evaluation not supported by this policy evaluator".to_string()],
54 })
55 }
56
57 async fn batch_evaluate(
59 &self,
60 requests: Vec<(OperationEntity, ServerConfigEntity)>,
61 ) -> Result<Vec<AuthorizationDecision>, PolicyEvaluationError> {
62 let mut results = Vec::with_capacity(requests.len());
63 for (op, config) in &requests {
64 results.push(self.evaluate_operation(op, config).await?);
65 }
66 Ok(results)
67 }
68
69 fn is_configured(&self) -> bool {
71 true
72 }
73
74 fn name(&self) -> &str;
76}