zlayer-tui 0.9.991

Shared TUI widgets, color palette, and terminal utilities for ZLayer
Documentation
use ratatui::prelude::*;

pub const PENDING: char = '\u{25CB}';
pub const RUNNING: char = '\u{25B6}';
pub const COMPLETE: char = '\u{2713}';
pub const FAILED: char = '\u{2717}';
pub const STOPPING: char = '\u{25BC}';
pub const STOPPED: char = '\u{25A0}';
pub const PROGRESS_FILLED: char = '\u{2588}';
pub const PROGRESS_EMPTY: char = '\u{2591}';
pub const ARROW_UP: char = '\u{2191}';
pub const ARROW_DOWN: char = '\u{2193}';

pub const SPINNER_FRAMES: &[char] = &['|', '/', '-', '\\'];

pub fn status_icon(done: bool, running: bool, failed: bool) -> (char, Style) {
    if failed {
        (FAILED, Style::default().fg(Color::Red))
    } else if done {
        (COMPLETE, Style::default().fg(Color::Green))
    } else if running {
        (
            RUNNING,
            Style::default()
                .fg(Color::Yellow)
                .add_modifier(Modifier::BOLD),
        )
    } else {
        (PENDING, Style::default().fg(Color::DarkGray))
    }
}

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

    #[test]
    fn icon_characters_are_correct() {
        assert_eq!(PENDING, '');
        assert_eq!(RUNNING, '');
        assert_eq!(COMPLETE, '');
        assert_eq!(FAILED, '');
        assert_eq!(STOPPING, '');
        assert_eq!(STOPPED, '');
        assert_eq!(PROGRESS_FILLED, '');
        assert_eq!(PROGRESS_EMPTY, '');
        assert_eq!(ARROW_UP, '');
        assert_eq!(ARROW_DOWN, '');
    }

    #[test]
    fn spinner_frames_has_four_entries() {
        assert_eq!(SPINNER_FRAMES.len(), 4);
        assert_eq!(SPINNER_FRAMES[0], '|');
        assert_eq!(SPINNER_FRAMES[3], '\\');
    }

    #[test]
    fn status_icon_failed_takes_priority() {
        let (icon, style) = status_icon(true, true, true);
        assert_eq!(icon, FAILED);
        assert_eq!(style.fg, Some(Color::Red));
    }

    #[test]
    fn status_icon_done() {
        let (icon, style) = status_icon(true, false, false);
        assert_eq!(icon, COMPLETE);
        assert_eq!(style.fg, Some(Color::Green));
    }

    #[test]
    fn status_icon_running() {
        let (icon, style) = status_icon(false, true, false);
        assert_eq!(icon, RUNNING);
        assert_eq!(style.fg, Some(Color::Yellow));
        assert!(style.add_modifier.contains(Modifier::BOLD));
    }

    #[test]
    fn status_icon_pending() {
        let (icon, style) = status_icon(false, false, false);
        assert_eq!(icon, PENDING);
        assert_eq!(style.fg, Some(Color::DarkGray));
    }
}