use ferogram_tl_parser::tl::{Category, Definition, Type};
use std::collections::HashMap;
pub(crate) fn group_by_ns(
defs: &[Definition],
category: Category,
) -> HashMap<String, Vec<&Definition>> {
let mut map: HashMap<String, Vec<&Definition>> = HashMap::new();
for def in defs.iter().filter(|d| d.category == category) {
assert!(
def.namespace.len() <= 1,
"only one namespace level supported"
);
let ns = def.namespace.first().map(|s| s.as_str()).unwrap_or("");
map.entry(ns.to_owned()).or_default().push(def);
}
for bucket in map.values_mut() {
bucket.sort_by_key(|d| &d.name);
}
map
}
pub(crate) fn group_types_by_ns(defs: &[Definition]) -> HashMap<Option<String>, Vec<&Type>> {
let mut map: HashMap<Option<String>, Vec<&Type>> = HashMap::new();
for def in defs
.iter()
.filter(|d| d.category == Category::Types && !d.ty.generic_ref)
{
assert!(def.namespace.len() <= 1);
map.entry(def.namespace.first().cloned())
.or_default()
.push(&def.ty);
}
for bucket in map.values_mut() {
bucket.sort_by_key(|t| &t.name);
bucket.dedup_by_key(|t| &t.name);
}
map
}