use super::event::AuditEvent;
use super::query::AuditQueryBuilder;
use std::future::Future;
use std::pin::Pin;
pub type AuditResult<T> = Result<T, AuditError>;
#[derive(Debug, thiserror::Error)]
pub enum AuditError {
#[error("Failed to write audit event: {0}")]
WriteError(String),
#[error("Failed to read audit events: {0}")]
ReadError(String),
#[error("Audit storage is full")]
StorageFull,
#[error("Audit event not found: {0}")]
NotFound(String),
#[error("Serialization error: {0}")]
SerializationError(String),
#[error("IO error: {0}")]
IoError(String),
#[error("Configuration error: {0}")]
ConfigError(String),
}
pub trait AuditStore: Send + Sync {
fn log(&self, event: AuditEvent) -> AuditResult<()>;
fn log_async(
&self,
event: AuditEvent,
) -> Pin<Box<dyn Future<Output = AuditResult<()>> + Send + '_>> {
Box::pin(async move { self.log(event) })
}
fn get(&self, id: &str) -> AuditResult<Option<AuditEvent>>;
fn query(&self) -> AuditQueryBuilder<'_>
where
Self: Sized,
{
AuditQueryBuilder::new(self)
}
fn execute_query(&self, query: &super::query::AuditQuery) -> AuditResult<Vec<AuditEvent>>;
fn count(&self, query: &super::query::AuditQuery) -> AuditResult<usize>;
fn total_count(&self) -> AuditResult<usize>;
fn clear(&self) -> AuditResult<()>;
fn flush(&self) -> AuditResult<()>;
}