use crate::{AuditEntry, DecisionSummary, Locale};
use async_trait::async_trait;
use std::convert::Infallible;
use std::error::Error as StdError;
pub trait PolicyObserver: Send + Sync {
fn observe(&self, decision_summary: &DecisionSummary);
}
#[derive(Default)]
pub struct NoopPolicyObserver;
impl PolicyObserver for NoopPolicyObserver {
fn observe(&self, _decision_summary: &DecisionSummary) {}
}
#[async_trait]
pub trait AuditSink: Send + Sync {
type Error: StdError + Send + Sync + 'static;
async fn record(&self, entry: &AuditEntry) -> Result<(), Self::Error>;
}
#[derive(Default)]
pub struct NoopAuditSink;
#[async_trait]
impl AuditSink for NoopAuditSink {
type Error = Infallible;
async fn record(&self, _entry: &AuditEntry) -> Result<(), Self::Error> {
Ok(())
}
}
pub trait ReasonCatalog {
fn render(&self, reason: &crate::DenialReason, locale: &Locale) -> String;
}
#[derive(Default)]
pub struct IdentityReasonCatalog;
impl ReasonCatalog for IdentityReasonCatalog {
fn render(&self, reason: &crate::DenialReason, _locale: &Locale) -> String {
reason.code.as_str().to_owned()
}
}