fea_rs/compile/
language_system.rs1use std::{collections::HashSet, rc::Rc};
4
5use write_fonts::types::Tag;
6
7use super::{lookups::FeatureKey, tags};
8
9#[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#[derive(Clone, Debug)]
21pub(crate) struct DefaultLanguageSystems {
22 has_explicit_entry: bool,
23 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 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}