use std::collections::BTreeMap;
use std::convert::Infallible;
use std::error::Error;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::evaluation::DecisionKind;
use crate::model::{ActorRef, KeepsakeId, RelationId, SubjectRef};
#[cfg(any(test, feature = "test"))]
mod memory;
#[cfg(any(test, feature = "test"))]
pub use memory::{InMemoryAuditError, InMemoryAuditSink};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AuditEvent {
pub at: DateTime<Utc>,
pub actor: ActorRef,
pub keepsake_id: KeepsakeId,
pub subject: SubjectRef,
pub relation_id: RelationId,
pub decision: DecisionKind,
pub context: AuditContext,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct AuditContext {
pub attributes: BTreeMap<String, String>,
}
pub trait AuditSink: Send + Sync {
type Error: Error + Send + Sync + 'static;
fn record(&self, event: AuditEvent) -> std::result::Result<(), Self::Error>;
}
#[derive(Debug, Clone, Copy, Default)]
pub struct NoopAuditSink;
impl AuditSink for NoopAuditSink {
type Error = Infallible;
fn record(&self, _event: AuditEvent) -> std::result::Result<(), Self::Error> {
Ok(())
}
}