use crate::phonetic::common::utils::is_user_symbol_name;
pub const MAX_PATTERN_SIZE: usize = 10_000;
pub use crate::phonetic::common::utils::SymbolTable;
pub(super) fn resolve_feature_bundle_chars(
terms: &[(String, bool)],
symbols: Option<&SymbolTable>,
) -> Result<Vec<char>, String> {
use crate::phonetic::named_classes::{get_chars_only, intersect_char_sets, negate_char_set};
let mut char_sets: Vec<Vec<char>> = Vec::new();
for (name, negated) in terms {
let chars = if let Some(symbol_table) = symbols {
if let Some(symbol_chars) = symbol_table.get(name) {
symbol_chars.clone()
} else if let Some(builtin_chars) = get_chars_only(name) {
builtin_chars
} else {
return Err(format!("unknown class or symbol '{}'", name));
}
} else if let Some(builtin_chars) = get_chars_only(name) {
builtin_chars
} else if is_user_symbol_name(name) {
return Err(format!("undefined symbol '{}'", name));
} else {
return Err(format!("unknown named class '{}'", name));
};
let final_chars = if *negated {
negate_char_set(&chars)
} else {
chars
};
char_sets.push(final_chars);
}
Ok(intersect_char_sets(&char_sets))
}