use super::section::SectionSchema;
use super::validate::{ValidationError, ValidationResult};
use std::collections::HashMap;
use std::sync::{Arc, RwLock};
#[derive(Debug, Clone)]
pub struct SchemaRegistry {
schemas: Arc<RwLock<HashMap<String, SectionSchema>>>,
}
impl SchemaRegistry {
pub fn new() -> Self {
Self {
schemas: Arc::new(RwLock::new(HashMap::new())),
}
}
pub fn global() -> &'static Self {
use std::sync::OnceLock;
static INSTANCE: OnceLock<SchemaRegistry> = OnceLock::new();
INSTANCE.get_or_init(|| {
let registry = SchemaRegistry::new();
super::official::register_official_schemas(®istry);
registry
})
}
pub fn register(&self, schema: SectionSchema) {
let mut schemas = self.schemas.write().unwrap();
schemas.insert(schema.name.clone(), schema);
}
pub fn get(&self, name: &str) -> ValidationResult<SectionSchema> {
let schemas = self.schemas.read().unwrap();
schemas
.get(name)
.cloned()
.ok_or_else(|| ValidationError::UnknownSection {
name: name.to_string(),
})
}
pub fn list(&self) -> Vec<String> {
let schemas = self.schemas.read().unwrap();
schemas.keys().cloned().collect()
}
}
impl Default for SchemaRegistry {
fn default() -> Self {
Self::new()
}
}
pub type UserRegistry = SchemaRegistry;