use crate::data::store::LocaleProfile;
use bistun_core::error::LmsError;
use bistun_core::manifest::{CapabilityManifest, TraitValue};
use bistun_core::traits::TraitKey;
use std::cmp;
pub fn aggregate(
manifest: &mut CapabilityManifest,
profile: &LocaleProfile,
) -> Result<(), LmsError> {
let final_seg = match profile.alt_seg {
Some(alt) => cmp::max(profile.base_seg, alt),
None => profile.base_seg,
};
manifest.traits.insert(TraitKey::MorphologyType, TraitValue::MorphType(profile.morph));
manifest.traits.insert(TraitKey::SegmentationStrategy, TraitValue::SegType(final_seg));
manifest
.traits
.insert(TraitKey::PluralCategories, TraitValue::StringArray(profile.plurals.clone()));
manifest.traits.insert(
TraitKey::UnicodePreloadBlocks,
TraitValue::StringArray(profile.unicode_blocks.clone()),
);
manifest
.traits
.insert(TraitKey::NormalizationType, TraitValue::NormType(profile.normalization));
manifest
.traits
.insert(TraitKey::TransliterationType, TraitValue::TransType(profile.transliteration));
if let Some(resource_id) = &profile.required_resource {
manifest.traits.insert(TraitKey::ResourceId, TraitValue::String(resource_id.clone()));
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use bistun_core::traits::{Direction, MorphType, NormType, SegType, TransType};
fn create_mock_profile(
morph: MorphType,
base_seg: SegType,
alt_seg: Option<SegType>,
) -> LocaleProfile {
LocaleProfile {
id: "test-locale".to_string(),
morph,
base_seg,
alt_seg,
direction: Direction::LTR,
has_bidi: false,
requires_shaping: false,
plurals: vec!["one".to_string(), "other".to_string()],
unicode_blocks: vec!["Basic Latin".to_string()],
normalization: NormType::NFC,
transliteration: TransType::NONE,
required_resource: None,
}
}
#[test]
fn test_aggregate_standard_profile() {
let mut manifest = CapabilityManifest::new("en-US".to_string());
let profile = create_mock_profile(MorphType::FUSIONAL, SegType::SPACE, None);
assert!(aggregate(&mut manifest, &profile).is_ok());
assert_eq!(
manifest.traits.get(&TraitKey::MorphologyType),
Some(&TraitValue::MorphType(MorphType::FUSIONAL))
);
assert_eq!(
manifest.traits.get(&TraitKey::PluralCategories),
Some(&TraitValue::StringArray(vec!["one".to_string(), "other".to_string()]))
);
assert_eq!(
manifest.traits.get(&TraitKey::NormalizationType),
Some(&TraitValue::NormType(NormType::NFC))
);
}
#[test]
fn test_aggregate_high_water_mark() {
let mut manifest = CapabilityManifest::new("ja-JP".to_string());
let profile = create_mock_profile(
MorphType::AGGLUTINATIVE,
SegType::CHARACTER,
Some(SegType::DICTIONARY),
);
assert!(aggregate(&mut manifest, &profile).is_ok());
let seg = manifest.traits.get(&TraitKey::SegmentationStrategy);
assert_eq!(seg, Some(&TraitValue::SegType(SegType::DICTIONARY)));
}
}