use crate::traits::{Direction, LmsRule, MorphType, SegType, TraitKey};
use hashbrown::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum TraitValue {
Direction(Direction),
SegType(SegType),
MorphType(MorphType),
Boolean(bool),
StringArray(Vec<String>),
String(String),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CapabilityManifest {
pub resolved_locale: String,
pub traits: HashMap<TraitKey, TraitValue>,
pub rules: HashMap<String, LmsRule>,
pub resources: HashMap<String, String>,
pub extensions: HashMap<String, String>,
pub metadata: HashMap<String, String>,
}
impl CapabilityManifest {
#[must_use]
pub fn new(resolved_locale: String) -> Self {
Self {
resolved_locale,
traits: HashMap::new(),
rules: HashMap::new(),
resources: HashMap::new(),
extensions: HashMap::new(),
metadata: HashMap::new(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_manifest_serialization() {
let mut manifest = CapabilityManifest::new("ar-EG-u-nu-latn".to_string());
manifest.traits.insert(TraitKey::PrimaryDirection, TraitValue::Direction(Direction::RTL));
manifest.traits.insert(TraitKey::HasBidiElements, TraitValue::Boolean(true));
manifest
.traits
.insert(TraitKey::MorphologyType, TraitValue::MorphType(MorphType::TEMPLATIC));
manifest
.traits
.insert(TraitKey::DefaultNumberingSystem, TraitValue::String("arab".to_string()));
manifest.rules.insert(
"TRANSLITERATION_DEFAULT".to_string(),
LmsRule::Trans(crate::traits::TransRule::ICU_TRANSFORM),
);
manifest.resources.insert(
"icu_arab".to_string(),
"https://cdn.bistun.io/v1/data/icu_arab.postcard".to_string(),
);
manifest.extensions.insert("nu".to_string(), "latn".to_string());
manifest.metadata.insert("registry_version".to_string(), "2.0.0".to_string());
let json_output =
serde_json::to_string(&manifest).expect("LMS-TEST: Failed to serialize manifest");
let parsed: serde_json::Value =
serde_json::from_str(&json_output).expect("LMS-TEST: Failed to parse JSON");
assert_eq!(parsed["resolved_locale"], "ar-EG-u-nu-latn");
assert_eq!(parsed["traits"]["PRIMARY_DIRECTION"], "RTL");
assert_eq!(parsed["traits"]["DEFAULT_NUMBERING_SYSTEM"], "arab");
assert_eq!(parsed["rules"]["TRANSLITERATION_DEFAULT"], "ICU_TRANSFORM");
assert_eq!(
parsed["resources"]["icu_arab"],
"https://cdn.bistun.io/v1/data/icu_arab.postcard"
);
assert_eq!(parsed["extensions"]["nu"], "latn");
assert_eq!(parsed["metadata"]["registry_version"], "2.0.0");
}
}