Skip to main content

mant_protocol/
labels.rs

1//! Stable entry labels; fallback text never creates a selectable name.
2
3/// Which already validated entry facts supply a display label first.
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub enum EntryLabelMode {
6    /// Names, then complete visible forms, then the existing identity.
7    Compact,
8    /// Complete visible forms, then the compact fallback.
9    Forms,
10}
11
12/// Produce a nonempty entry label without parsing names or implying aliases.
13///
14/// Callers supply validated names and visible form text. This does not perform
15/// terminal escaping: adapters sanitize the resulting label for their surface.
16#[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}