use crate::config::AuditConfig;
use crate::context::AuditContext;
use crate::service::AuditMiddleware;
use std::sync::Arc;
use tower_layer::Layer;
#[derive(Clone)]
pub struct AuditLayer {
pub(crate) config: Arc<AuditConfig>,
pub(crate) ctx: AuditContext,
}
impl AuditLayer {
pub fn new(config: AuditConfig) -> (Self, AuditContext) {
let (ctx, rx) = AuditContext::channel();
let config = Arc::new(config);
crate::writer::BatchWriter::new(&config, rx).spawn();
let layer = Self {
config,
ctx: ctx.clone(),
};
(layer, ctx)
}
}
impl<S> Layer<S> for AuditLayer {
type Service = AuditMiddleware<S>;
fn layer(&self, service: S) -> Self::Service {
AuditMiddleware {
inner: service,
config: Arc::clone(&self.config),
ctx: self.ctx.clone(),
}
}
}