Skip to main content

kashida/
builtin.rs

1//! The built-in pattern sets, compiled on first use.
2
3use crate::pattern::{compile_pattern_text, PatternSet};
4use std::sync::OnceLock;
5
6const ARABIC_SIMPLE_TEXT: &str = include_str!("../data/arabic-simple.pat");
7const ARABIC_NASKH_TEXT: &str = include_str!("../data/arabic-naskh.pat");
8const SYRIAC_TEXT: &str = include_str!("../data/syriac.pat");
9
10fn arabic_simple_set() -> &'static PatternSet {
11    static SET: OnceLock<PatternSet> = OnceLock::new();
12    SET.get_or_init(|| {
13        compile_pattern_text(ARABIC_SIMPLE_TEXT).expect("built-in \"arabic-simple\" compiles")
14    })
15}
16
17fn arabic_naskh_set() -> &'static PatternSet {
18    static SET: OnceLock<PatternSet> = OnceLock::new();
19    SET.get_or_init(|| {
20        compile_pattern_text(ARABIC_NASKH_TEXT).expect("built-in \"arabic-naskh\" compiles")
21    })
22}
23
24fn syriac_set() -> &'static PatternSet {
25    static SET: OnceLock<PatternSet> = OnceLock::new();
26    SET.get_or_init(|| compile_pattern_text(SYRIAC_TEXT).expect("built-in \"syriac\" compiles"))
27}
28
29/// Whether `name` refers to a built-in pattern set, without compiling it,
30/// unlike [`builtin_pattern_set`].
31pub fn is_builtin_pattern_set(name: &str) -> bool {
32    matches!(name, "arabic-simple" | "arabic-naskh" | "syriac")
33}
34
35/// The built-in pattern set of that name.
36pub fn builtin_pattern_set(name: &str) -> Option<&'static PatternSet> {
37    match name {
38        "arabic-simple" => Some(arabic_simple_set()),
39        "arabic-naskh" => Some(arabic_naskh_set()),
40        "syriac" => Some(syriac_set()),
41        _ => None,
42    }
43}