use bistun_core::error::LmsError;
use bistun_core::manifest::{CapabilityManifest, TraitValue};
use bistun_core::traits::{LmsRule, MorphType, NormRule, TraitKey, TransRule};
#[must_use = "The Result of synthesize_rules must be handled to ensure manifest integrity before Phase 4"]
pub fn synthesize_rules(manifest: &mut CapabilityManifest) -> Result<(), LmsError> {
if let Some(TraitValue::MorphType(morph)) = manifest.traits.get(&TraitKey::MorphologyType) {
let rule = match morph {
MorphType::TEMPLATIC | MorphType::AGGLUTINATIVE | MorphType::POLYSYNTHETIC => {
LmsRule::Trans(TransRule::ICU_TRANSFORM)
}
_ => LmsRule::Trans(TransRule::ICU_TRANSFORM),
};
manifest.rules.insert("STEMMING_STRATEGY".to_string(), rule);
}
manifest
.rules
.entry("NORMALIZATION_DEFAULT".to_string())
.or_insert(LmsRule::Norm(NormRule::NFC));
manifest
.rules
.entry("TRANSLITERATION_DEFAULT".to_string())
.or_insert(LmsRule::Trans(TransRule::NONE));
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use bistun_core::manifest::TraitValue;
use bistun_core::traits::{MorphType, TraitKey};
#[test]
fn test_synthesizer_injects_templatic_rule_and_defaults() {
let mut manifest = CapabilityManifest::new("ar-SA".to_string());
manifest
.traits
.insert(TraitKey::MorphologyType, TraitValue::MorphType(MorphType::TEMPLATIC));
synthesize_rules(&mut manifest).expect("LMS-TEST: Synthesis failed");
assert!(manifest.rules.contains_key("STEMMING_STRATEGY"));
assert_eq!(
manifest.rules.get("NORMALIZATION_DEFAULT"),
Some(&LmsRule::Norm(NormRule::NFC))
);
assert_eq!(
manifest.rules.get("TRANSLITERATION_DEFAULT"),
Some(&LmsRule::Trans(TransRule::NONE))
);
}
#[test]
fn test_synthesizer_skips_morphology_but_guarantees_defaults() {
let mut manifest = CapabilityManifest::new("en-US".to_string());
synthesize_rules(&mut manifest).expect("LMS-TEST: Synthesis failed");
assert!(!manifest.rules.contains_key("STEMMING_STRATEGY"));
assert!(manifest.rules.contains_key("NORMALIZATION_DEFAULT"));
}
#[test]
fn test_synthesizer_does_not_overwrite_existing_rules() {
let mut manifest = CapabilityManifest::new("en-US".to_string());
manifest.rules.insert("NORMALIZATION_DEFAULT".to_string(), LmsRule::Norm(NormRule::NFD));
synthesize_rules(&mut manifest).expect("LMS-TEST: Synthesis failed");
assert_eq!(
manifest.rules.get("NORMALIZATION_DEFAULT"),
Some(&LmsRule::Norm(NormRule::NFD))
);
}
}