#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EntryLabelMode {
Compact,
Forms,
}
#[must_use]
pub fn entry_label<S: AsRef<str>>(
mode: EntryLabelMode,
id: &str,
names: &[String],
forms: impl IntoIterator<Item = S>,
) -> String {
if mode == EntryLabelMode::Compact && !names.is_empty() {
return names.join(", ");
}
let forms = forms
.into_iter()
.filter_map(|form| {
let text = form.as_ref();
(!text.trim().is_empty()).then(|| text.to_owned())
})
.collect::<Vec<_>>();
if !forms.is_empty() {
forms.join(" | ")
} else if !names.is_empty() {
names.join(", ")
} else {
id.to_owned()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn label_modes_keep_names_forms_and_identity_distinct() {
let names = ["-x".to_owned(), "--language".to_owned()];
let forms = ["-x LANG", "--language=LANG"];
assert_eq!(
entry_label(EntryLabelMode::Compact, "id", &names, forms),
"-x, --language"
);
assert_eq!(
entry_label(EntryLabelMode::Forms, "id", &names, forms),
"-x LANG | --language=LANG"
);
for mode in [EntryLabelMode::Compact, EntryLabelMode::Forms] {
assert_eq!(
entry_label(mode, "id", &[], ["find-new ARG"]),
"find-new ARG"
);
assert_eq!(entry_label(mode, "id", &[], ["", " "]), "id");
assert_eq!(entry_label(mode, "id", &names, [""]), "-x, --language");
}
}
}