fea_rs/compile/
language_system.rs

1//! helpers for managing tracking language systems
2
3use std::{collections::HashSet, rc::Rc};
4
5use write_fonts::types::Tag;
6
7use super::{lookups::FeatureKey, tags};
8
9/// A script/language pair
10#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
11#[allow(missing_docs)]
12pub struct LanguageSystem {
13    pub script: Tag,
14    pub language: Tag,
15}
16
17/// Track languagesystem statements
18///
19/// Seeing no statements is the same as seeing 'DFLT dflt'.
20#[derive(Clone, Debug)]
21pub(crate) struct DefaultLanguageSystems {
22    has_explicit_entry: bool,
23    // this is me being fancy, because we clone this everytime we start a lookup.
24    items: Rc<HashSet<LanguageSystem>>,
25}
26
27impl DefaultLanguageSystems {
28    pub(crate) fn insert(&mut self, system: LanguageSystem) {
29        if !self.has_explicit_entry {
30            Rc::get_mut(&mut self.items).unwrap().clear();
31            self.has_explicit_entry = true;
32        }
33        Rc::get_mut(&mut self.items).unwrap().insert(system);
34    }
35
36    pub(crate) fn contains(&self, key: &LanguageSystem) -> bool {
37        self.items.contains(key)
38    }
39
40    pub fn iter(&self) -> impl Iterator<Item = LanguageSystem> + '_ {
41        self.items.iter().copied()
42    }
43}
44
45impl LanguageSystem {
46    /// Generate a `FeatureKey` for this langauge system.
47    pub fn to_feature_key(self, feature: Tag) -> FeatureKey {
48        let LanguageSystem { script, language } = self;
49        FeatureKey {
50            feature,
51            language,
52            script,
53        }
54    }
55}
56
57impl Default for LanguageSystem {
58    fn default() -> Self {
59        Self {
60            script: tags::SCRIPT_DFLT,
61            language: tags::LANG_DFLT,
62        }
63    }
64}
65
66impl Default for DefaultLanguageSystems {
67    fn default() -> Self {
68        Self {
69            has_explicit_entry: false,
70            items: Rc::new(HashSet::from_iter([LanguageSystem::default()])),
71        }
72    }
73}