use super::index::GraphIndex;
#[derive(Debug, Clone, PartialEq)]
pub struct MemberRefEntry {
pub name: String,
pub count: usize,
}
#[derive(Debug, Clone, PartialEq)]
pub struct MemberRefs {
pub total: usize,
pub member_count: usize,
pub members: Vec<MemberRefEntry>,
pub dropped: usize,
}
const MEMBER_NAME_CAP: usize = 5;
pub(super) fn enum_member_refs(index: &GraphIndex, def_id: &str) -> Option<MemberRefs> {
let prefix = format!("{def_id}.");
let mut members: Vec<MemberRefEntry> = Vec::new();
let mut total = 0usize;
for d in &index.graph.defs {
if d.kind != "enum-member" || !d.id.starts_with(&prefix) {
continue;
}
let count = index.inbound.get(&d.id).map_or(0, |e| e.uses_member.len())
+ index
.heuristic_inbound
.get(&d.id)
.map_or(0, |e| e.uses_member.len());
if count == 0 {
continue;
}
members.push(MemberRefEntry {
name: d.name.clone(),
count,
});
total += count;
}
if total == 0 {
return None;
}
let member_count = members.len();
let dropped = member_count.saturating_sub(MEMBER_NAME_CAP);
members.truncate(MEMBER_NAME_CAP);
Some(MemberRefs {
total,
member_count,
members,
dropped,
})
}