use alloc::sync::Arc;
use alloc::vec::Vec;
use core::fmt;
use super::{AccessContext, FailureContext, SecurityMonitor, ThresholdContext};
#[derive(Clone)]
pub struct CompositeMonitor {
inner: Vec<Arc<dyn SecurityMonitor>>,
}
impl CompositeMonitor {
#[must_use]
pub fn new(inner: Vec<Arc<dyn SecurityMonitor>>) -> Self {
Self { inner }
}
#[must_use]
pub fn len(&self) -> usize {
self.inner.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
}
impl fmt::Debug for CompositeMonitor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("CompositeMonitor")
.field("inner_count", &self.inner.len())
.finish()
}
}
impl SecurityMonitor for CompositeMonitor {
fn on_decryption_failure(&self, ctx: &FailureContext) {
for m in &self.inner {
m.on_decryption_failure(ctx);
}
}
fn on_anomalous_access(&self, ctx: &AccessContext) {
for m in &self.inner {
m.on_anomalous_access(ctx);
}
}
fn on_threshold_breach(&self, ctx: &ThresholdContext) {
for m in &self.inner {
m.on_threshold_breach(ctx);
}
}
}