use anyhow::Result;
use std::collections::HashMap;
use crate::configuration::EventSchema;
#[derive(Clone)]
pub struct NotificationRegistry {
schemas: HashMap<String, EventSchema>,
}
impl Default for NotificationRegistry {
fn default() -> Self {
Self::new()
}
}
impl NotificationRegistry {
pub fn new() -> Self {
Self {
schemas: HashMap::new(),
}
}
pub fn from_config(schemas: &HashMap<String, EventSchema>) -> Self {
Self {
schemas: schemas.clone(),
}
}
pub fn get_schema(&self, event_type: &str) -> Option<&EventSchema> {
self.schemas.get(event_type)
}
pub fn has_schema(&self, event_type: &str) -> bool {
self.schemas.contains_key(event_type)
}
pub fn get_schema_names(&self) -> Vec<String> {
self.schemas.keys().cloned().collect()
}
pub fn get_identifier_keys(&self, event_type: &str) -> Result<Vec<String>> {
if let Some(schema) = self.get_schema(event_type) {
Ok(schema.identifier.keys().cloned().collect())
} else {
Ok(Vec::new())
}
}
pub fn get_required_identifier_keys(&self, event_type: &str) -> Result<Vec<String>> {
if let Some(schema) = self.get_schema(event_type) {
let required_keys: Vec<String> = schema
.identifier
.iter()
.filter_map(|(key, field_config)| {
let is_required = field_config.is_required();
if is_required { Some(key.clone()) } else { None }
})
.collect();
Ok(required_keys)
} else {
Ok(Vec::new())
}
}
pub fn get_whole_schema(&self) -> &HashMap<String, EventSchema> {
&self.schemas
}
}