1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub enum EntryLabelMode {
6 Compact,
8 Forms,
10}
11
12#[must_use]
17pub fn entry_label<S: AsRef<str>>(
18 mode: EntryLabelMode,
19 id: &str,
20 names: &[String],
21 forms: impl IntoIterator<Item = S>,
22) -> String {
23 if mode == EntryLabelMode::Compact && !names.is_empty() {
24 return names.join(", ");
25 }
26 let forms = forms
27 .into_iter()
28 .filter_map(|form| {
29 let text = form.as_ref();
30 (!text.trim().is_empty()).then(|| text.to_owned())
31 })
32 .collect::<Vec<_>>();
33 if !forms.is_empty() {
34 forms.join(" | ")
35 } else if !names.is_empty() {
36 names.join(", ")
37 } else {
38 id.to_owned()
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn label_modes_keep_names_forms_and_identity_distinct() {
48 let names = ["-x".to_owned(), "--language".to_owned()];
49 let forms = ["-x LANG", "--language=LANG"];
50 assert_eq!(
51 entry_label(EntryLabelMode::Compact, "id", &names, forms),
52 "-x, --language"
53 );
54 assert_eq!(
55 entry_label(EntryLabelMode::Forms, "id", &names, forms),
56 "-x LANG | --language=LANG"
57 );
58 for mode in [EntryLabelMode::Compact, EntryLabelMode::Forms] {
59 assert_eq!(
60 entry_label(mode, "id", &[], ["find-new ARG"]),
61 "find-new ARG"
62 );
63 assert_eq!(entry_label(mode, "id", &[], ["", " "]), "id");
64 assert_eq!(entry_label(mode, "id", &names, [""]), "-x, --language");
65 }
66 }
67}