#![cfg(feature = "persistence")]
use crate::traits::LmsRule;
use crate::{TraitKey, TraitValue};
use hashbrown::HashMap;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct RegistryMetadata {
pub version: String,
pub build_date: String,
pub checksum: String,
}
impl Default for RegistryMetadata {
fn default() -> Self {
Self {
version: "v0.0.0-default".to_string(),
build_date: "1970-01-01T00:00:00Z".to_string(),
checksum: "00000000000000000000000000000000".to_string(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct LocaleProfile {
#[serde(rename = "ID")]
pub id: String,
#[serde(default)]
pub traits: HashMap<TraitKey, TraitValue>,
#[serde(default)]
pub rules: HashMap<String, LmsRule>,
#[serde(default)]
pub resources: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct WormPayload {
pub metadata: RegistryMetadata,
pub profiles: Vec<LocaleProfile>,
#[serde(default)]
pub aliases: HashMap<String, String>,
}
#[derive(Debug, Default)]
pub struct RegistryStore {
pub metadata: Arc<RegistryMetadata>,
pub base_resource_uri: Arc<String>,
pools: HashMap<String, Arc<LocaleProfile>>,
aliases: HashMap<String, String>,
}
impl RegistryStore {
#[must_use]
pub fn new() -> Self {
Self {
metadata: Arc::new(RegistryMetadata::default()),
base_resource_uri: Arc::new(String::new()),
pools: HashMap::new(),
aliases: HashMap::new(),
}
}
pub fn set_metadata(&mut self, metadata: RegistryMetadata) {
self.metadata = Arc::new(metadata);
}
pub fn set_base_resource_uri(&mut self, uri: String) {
self.base_resource_uri = Arc::new(uri);
}
#[must_use]
pub fn get_profile(&self, id: &str) -> Option<Arc<LocaleProfile>> {
self.pools.get(id).cloned()
}
#[must_use]
pub fn resolve_alias(&self, tag: &str) -> Option<String> {
self.aliases.get(tag).cloned()
}
pub fn insert_stub(&mut self, profile: LocaleProfile) {
self.pools.insert(profile.id.clone(), Arc::new(profile));
}
pub fn insert_alias(&mut self, alias: String, canonical: String) {
self.aliases.insert(alias, canonical);
}
}