macnetmon 0.1.3

Network interface bandwidth monitor for macOS
use ratatui::style::Color;

pub const SOLID_THEMES: [(&str, Color); 7] = [
    ("Green", Color::Green),
    ("Yellow", Color::Yellow),
    ("Red", Color::Red),
    ("Blue", Color::Blue),
    ("Magenta", Color::Magenta),
    ("Cyan", Color::Cyan),
    ("White", Color::White),
];

pub const DEFAULT_THEME: &str = "Green";

#[derive(Clone, Copy, Debug)]
pub struct BorderColors {
    pub outer: Color,
    pub pane: Color,
    pub tile: Color,
}

#[derive(Clone, Debug)]
pub struct Theme {
    pub name: &'static str,
    pub outer: Color,
    pub pane: Color,
    pub graph: Color,
    pub background: Color,
}

fn rgb(hex: &str) -> Color {
    let hex = hex.trim_start_matches('#');
    let r = u8::from_str_radix(&hex[0..2], 16).unwrap_or(0);
    let g = u8::from_str_radix(&hex[2..4], 16).unwrap_or(0);
    let b = u8::from_str_radix(&hex[4..6], 16).unwrap_or(0);
    Color::Rgb(r, g, b)
}

pub fn solid_tx_color(color: Color) -> Color {
    match color {
        Color::Red => rgb("#b22222"),
        Color::Green => rgb("#228b22"),
        Color::Yellow => rgb("#b8860b"),
        Color::Blue => rgb("#1e3a8a"),
        Color::Magenta => rgb("#8b1c62"),
        Color::Cyan => rgb("#0f766e"),
        Color::White => rgb("#a1a1aa"),
        _ => color,
    }
}

pub fn build_themes() -> Vec<Theme> {
    let mut themes = Vec::new();
    for (name, color) in SOLID_THEMES {
        themes.push(Theme {
            name,
            outer: color,
            pane: color,
            graph: color,
            background: Color::Reset,
        });
    }

    themes.extend([
        Theme {
            name: "Catppuccin Latte",
            outer: rgb("#7287fd"),
            pane: rgb("#ea76cb"),
            graph: rgb("#40a02b"),
            background: rgb("#eff1f5"),
        },
        Theme {
            name: "Catppuccin Frappe",
            outer: rgb("#8caaee"),
            pane: rgb("#f4b8e4"),
            graph: rgb("#a6d189"),
            background: rgb("#303446"),
        },
        Theme {
            name: "Catppuccin Macchiato",
            outer: rgb("#8aadf4"),
            pane: rgb("#f5bde6"),
            graph: rgb("#a6da95"),
            background: rgb("#24273a"),
        },
        Theme {
            name: "Catppuccin Mocha",
            outer: rgb("#89b4fa"),
            pane: rgb("#f5c2e7"),
            graph: rgb("#a6e3a1"),
            background: rgb("#1e1e2e"),
        },
        Theme {
            name: "Dracula",
            outer: rgb("#bd93f9"),
            pane: rgb("#ff79c6"),
            graph: rgb("#50fa7b"),
            background: rgb("#282a36"),
        },
        Theme {
            name: "Nord",
            outer: rgb("#88c0d0"),
            pane: rgb("#81a1c1"),
            graph: rgb("#a3be8c"),
            background: rgb("#2e3440"),
        },
        Theme {
            name: "Tokyo Night",
            outer: rgb("#7aa2f7"),
            pane: rgb("#bb9af7"),
            graph: rgb("#9ece6a"),
            background: rgb("#1a1b26"),
        },
        Theme {
            name: "Tokyo Storm",
            outer: rgb("#7aa2f7"),
            pane: rgb("#bb9af7"),
            graph: rgb("#9ece6a"),
            background: rgb("#24283b"),
        },
        Theme {
            name: "Tokyo Moon",
            outer: rgb("#82aaff"),
            pane: rgb("#c099ff"),
            graph: rgb("#c3e88d"),
            background: rgb("#222436"),
        },
        Theme {
            name: "Tokyo Day",
            outer: rgb("#2e7de9"),
            pane: rgb("#9854f1"),
            graph: rgb("#587539"),
            background: rgb("#e1e2e7"),
        },
    ]);

    themes
}