use std::collections::{BTreeMap, HashSet};
use crate::error::GroupsValidationError;
use crate::Name;
pub type Groups = BTreeMap<Name, Vec<Name>>;
pub(crate) fn validate_groups(groups_map: &Groups) -> Result<(), GroupsValidationError> {
let mut kern1_set = HashSet::new();
let mut kern2_set = HashSet::new();
for (group_name, group_glyph_names) in groups_map {
if group_name.is_empty() {
return Err(GroupsValidationError::InvalidName);
}
if group_name.starts_with("public.kern1.") {
if group_name.len() == 13 {
return Err(GroupsValidationError::InvalidName);
}
for glyph_name in group_glyph_names {
if !kern1_set.insert(glyph_name) {
return Err(GroupsValidationError::OverlappingKerningGroups {
glyph_name: glyph_name.clone(),
group_name: group_name.clone(),
});
}
}
} else if group_name.starts_with("public.kern2.") {
if group_name.len() == 13 {
return Err(GroupsValidationError::InvalidName);
}
for glyph_name in group_glyph_names {
if !kern2_set.insert(glyph_name) {
return Err(GroupsValidationError::OverlappingKerningGroups {
glyph_name: glyph_name.clone(),
group_name: group_name.clone(),
});
}
}
}
}
Ok(())
}