use std::collections::HashMap;
use super::event::{AuditEvent, ops};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct EntityKey {
pub entity: String,
pub entity_id: String,
pub scope: Option<String>,
}
#[derive(Debug, Clone)]
pub struct AuditState {
pub entities: HashMap<EntityKey, String>,
pub event_count: usize,
}
pub fn materialize_state(events: &[AuditEvent]) -> AuditState {
let mut entities: HashMap<EntityKey, String> = HashMap::new();
for event in events {
let key = EntityKey {
entity: event.entity.clone(),
entity_id: event.entity_id.clone(),
scope: event.scope.clone(),
};
if let Some(to) = &event.to {
entities.insert(key, to.clone());
} else if event.op == ops::RECONCILED {
entities.remove(&key);
} else if event.op == ops::CHANGE_ARCHIVE {
entities.insert(key, "archived".to_string());
}
}
AuditState {
event_count: events.len(),
entities,
}
}
#[cfg(test)]
#[path = "materialize_tests.rs"]
mod materialize_tests;