use std::collections::HashMap;
use super::loader::FaceInfo;
pub struct Family<'a> {
pub name: &'a str,
pub faces: Vec<&'a FaceInfo>,
pub default_name_width: usize,
}
impl<'a> Family<'a> {
pub fn new(name: &'a str) -> Self {
Self {
name,
faces: vec![],
default_name_width: name.len(),
}
}
pub fn styles_count(&self) -> usize {
self.faces.len()
}
pub fn add_face(&mut self, face: &'a FaceInfo) {
self.faces.push(face);
}
}
pub fn group_by_family_sort_by_name(faces: &[FaceInfo]) -> Vec<Family<'_>> {
let mut families = HashMap::new();
faces.iter().for_each(|face| {
let family = &face.family;
families
.entry(family)
.or_insert_with(|| Family::new(family))
.add_face(face);
});
let mut families: Vec<Family<'_>> = families.into_values().collect();
families.sort_by_key(|f| f.name);
for family in &mut families {
family.faces.sort_unstable_by(|a, b| a.name.cmp(&b.name))
}
families
}