use std::{collections::HashSet, rc::Rc};
use write_fonts::types::Tag;
use super::{lookups::FeatureKey, tags};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct LanguageSystem {
pub script: Tag,
pub language: Tag,
}
#[derive(Clone, Debug)]
pub(crate) struct DefaultLanguageSystems {
has_explicit_entry: bool,
items: Rc<HashSet<LanguageSystem>>,
}
impl DefaultLanguageSystems {
pub(crate) fn insert(&mut self, system: LanguageSystem) {
if !self.has_explicit_entry {
Rc::get_mut(&mut self.items).unwrap().clear();
self.has_explicit_entry = true;
}
Rc::get_mut(&mut self.items).unwrap().insert(system);
}
pub(crate) fn contains(&self, key: &LanguageSystem) -> bool {
self.items.contains(key)
}
pub(crate) fn iter(&self) -> impl Iterator<Item = LanguageSystem> + '_ {
self.items.iter().copied()
}
}
impl LanguageSystem {
pub(crate) fn to_feature_key(self, feature: Tag) -> FeatureKey {
let LanguageSystem { script, language } = self;
FeatureKey {
feature,
language,
script,
}
}
}
impl Default for LanguageSystem {
fn default() -> Self {
Self {
script: tags::SCRIPT_DFLT,
language: tags::LANG_DFLT,
}
}
}
impl Default for DefaultLanguageSystems {
fn default() -> Self {
Self {
has_explicit_entry: false,
items: Rc::new(HashSet::from_iter([LanguageSystem::default()])),
}
}
}