1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#[derive(Debug, Clone)]
pub struct Label {
    label: String,
    display: Option<String>,
}

impl Label {
    pub fn new(label: String, display: Option<String>) -> Self {
        Self { label, display }
    }

    pub fn label(&self) -> &str {
        &self.label
    }

    pub fn display(&self) -> &str {
        self.display.as_ref().unwrap_or(&self.label)
    }

    pub fn from_label(label: String, max_label_length: usize) -> Self {
        let len = label.len();
        let display = if len > max_label_length {
            let len_trim = std::cmp::min(len - max_label_length, 3);

            let label = &label[0..(max_label_length - len_trim)];
            let padding = ".".repeat(len_trim);
            Some(format!("{}{}", label, padding))
        } else if len < max_label_length {
            let padding = " ".repeat(max_label_length - len);
            Some(format!("{}{}", label, padding))
        } else {
            None
        };

        Self::new(label, display)
    }
}