colo 0.4.1

CLI tool to show and convert colors between various color spaces
use anyhow::Result;
use colored::{Color::TrueColor, Colorize};
use std::io::{stdout, Write};

use crate::{
    color::{html::HTML_COLOR_NAMES, space::Rgb, Color, TextColor},
    State,
};

const WHITE: colored::Color = TrueColor {
    r: 255,
    g: 255,
    b: 255,
};
const BLACK: colored::Color = TrueColor { r: 0, g: 0, b: 0 };

pub fn list(state: State) -> Result<()> {
    let mut stdout = stdout();

    let mut even = false;

    for &(name, color) in HTML_COLOR_NAMES {
        if name == "magenta" || name == "aqua" || name.ends_with("grey") {
            continue;
        }

        if !state.color {
            writeln!(stdout, "{}", name)?;
            continue;
        }

        let color = Color::Rgb(Rgb::from_hex(color));
        let term_color = color.to_term_color();
        let text_color = match color.text_color() {
            TextColor::Black => BLACK,
            TextColor::White => WHITE,
        };

        let name = format!(" {}{}", name, &"                      "[name.len()..]);
        write!(stdout, "{}", name.color(text_color).on_color(term_color))?;
        if even {
            writeln!(stdout)?;
        }
        even = !even;
    }
    writeln!(stdout)?;

    Ok(())
}