use crate::security::AuthIdentity;
use macp_core::policy::PolicyDecision;
use macp_core::session::Session;
use macp_pb::pb::Envelope;
#[async_trait::async_trait]
pub trait PolicyEngine: Send + Sync {
async fn evaluate_session_start(
&self,
identity: &AuthIdentity,
mode: &str,
env: &Envelope,
) -> PolicyDecision;
async fn evaluate_message(
&self,
identity: &AuthIdentity,
session: &Session,
env: &Envelope,
) -> PolicyDecision;
async fn evaluate_session_access(
&self,
identity: &AuthIdentity,
session: &Session,
) -> PolicyDecision;
}
pub fn require_allow(decision: PolicyDecision, what: &str) -> Result<(), tonic::Status> {
match decision {
PolicyDecision::Allow { .. } => Ok(()),
PolicyDecision::Deny { reasons } => Err(tonic::Status::permission_denied(format!(
"policy engine denied {what}: {}",
reasons.join("; ")
))),
other => Err(tonic::Status::permission_denied(format!(
"policy engine returned unrecognized decision for {what} (fail closed): {other:?}"
))),
}
}