#![cfg(feature = "persistence")]
use crate::traits::{Direction, MorphType, NormType, SegType, TransType};
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)]
#[serde(rename_all = "UPPERCASE")] pub struct LocaleProfile {
pub id: String,
pub morph: MorphType,
pub base_seg: SegType,
pub alt_seg: Option<SegType>,
pub direction: Direction,
pub has_bidi: bool,
pub requires_shaping: bool,
pub plurals: Vec<String>,
pub unicode_blocks: Vec<String>,
pub normalization: NormType,
pub transliteration: TransType,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub required_resource: Option<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 {
pub fn new() -> Self {
Self {
metadata: Arc::new(RegistryMetadata::default()),
base_resource_uri: Arc::new("http://localhost:8080/assets/".to_string()),
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);
}
pub fn get_profile(&self, id: &str) -> Option<Arc<LocaleProfile>> {
self.pools.get(id).cloned()
}
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);
}
}