use super::registry::{NamedClass, NAMED_CLASSES};
const MAX_CLASS_NAME_LEN: usize = 20;
#[inline]
fn normalize_class_name(name: &str) -> Option<([u8; MAX_CLASS_NAME_LEN], usize)> {
let len = name.len();
if len > MAX_CLASS_NAME_LEN || !name.is_ascii() {
return None;
}
let mut buf = [0u8; MAX_CLASS_NAME_LEN];
let bytes = name.as_bytes();
for (i, &b) in bytes.iter().enumerate() {
buf[i] = b.to_ascii_lowercase();
}
Some((buf, len))
}
pub fn get_named_class(name: &str) -> Option<&'static NamedClass> {
if let Some(class) = NAMED_CLASSES.get(name) {
return Some(class);
}
let (buf, len) = normalize_class_name(name)?;
let lowered = unsafe { std::str::from_utf8_unchecked(&buf[..len]) };
NAMED_CLASSES.get(lowered)
}
pub fn is_builtin_class(name: &str) -> bool {
if NAMED_CLASSES.contains_key(name) {
return true;
}
let Some((buf, len)) = normalize_class_name(name) else {
return false;
};
let lowered = unsafe { std::str::from_utf8_unchecked(&buf[..len]) };
NAMED_CLASSES.contains_key(lowered)
}
pub fn all_builtin_class_names() -> Vec<&'static str> {
let mut names: Vec<_> = NAMED_CLASSES.keys().copied().collect();
names.sort();
names.dedup();
names
}
pub fn get_chars_only(name: &str) -> Option<Vec<char>> {
get_named_class(name).map(|class| class.patterns.iter().filter_map(|p| p.as_char()).collect())
}
pub fn get_digraphs_only(name: &str) -> Option<Vec<(char, char)>> {
get_named_class(name).map(|class| {
class
.patterns
.iter()
.filter_map(|p| p.as_digraph())
.collect()
})
}
pub fn get_trigraphs_only(name: &str) -> Option<Vec<(char, char, char)>> {
get_named_class(name).map(|class| {
class
.patterns
.iter()
.filter_map(|p| p.as_trigraph())
.collect()
})
}
pub fn get_tetragraphs_only(name: &str) -> Option<Vec<(char, char, char, char)>> {
get_named_class(name).map(|class| {
class
.patterns
.iter()
.filter_map(|p| p.as_tetragraph())
.collect()
})
}
pub fn get_sequences_only(name: &str) -> Option<Vec<Vec<char>>> {
get_named_class(name).map(|class| {
class
.patterns
.iter()
.filter_map(|p| p.as_sequence().map(|s| s.to_vec()))
.collect()
})
}