a3s-tui 0.1.13

TEA (The Elm Architecture) framework for terminal user interfaces
Documentation
use crate::element::{BorderStyle, BoxElement, Element, TextElement};
use crate::style::{Color, Style};

pub struct Badge {
    label: String,
    color: Color,
}

impl Badge {
    pub fn new(label: impl Into<String>) -> Self {
        Self {
            label: label.into(),
            color: Color::Cyan,
        }
    }

    pub fn color(mut self, c: Color) -> Self {
        self.color = c;
        self
    }

    pub fn view(&self) -> String {
        Style::new()
            .fg(self.color)
            .bold()
            .render(&format!("[{}]", self.label))
    }

    pub fn element<Msg>(&self) -> Element<Msg> {
        Element::Box(
            BoxElement::new()
                .border(BorderStyle::Rounded)
                .border_color(self.color)
                .child(Element::Text(
                    TextElement::new(&self.label).fg(self.color).bold(),
                )),
        )
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::style::strip_ansi;

    #[test]
    fn badge_default_color() {
        let badge = Badge::new("test");
        assert_eq!(badge.color, Color::Cyan);
    }

    #[test]
    fn badge_custom_color() {
        let badge = Badge::new("OK").color(Color::Green);
        assert_eq!(badge.color, Color::Green);
    }

    #[test]
    fn badge_element() {
        let badge = Badge::new("v1.0");
        let el: Element<()> = badge.element();
        match el {
            Element::Box(b) => assert_eq!(b.children.len(), 1),
            _ => panic!("expected Box"),
        }
    }

    #[test]
    fn badge_view_renders_colored_label() {
        let rendered = Badge::new("sem").color(Color::Green).view();

        assert_eq!(strip_ansi(&rendered), "[sem]");
        assert!(rendered.contains("\x1b[1;32m[sem]\x1b[0m"));
    }
}