chromakitx 1.0.2

A comprehensive color manipulation library for Rust
Documentation
// SPDX-FileCopyrightText: 2023 CELESTIFYX Team
// SPDX-License-Identifier: GPL-3.0-or-later

use super::{
    ansi::AnsiColor,
    css::CssColor,
    style::TextStyle,
    xterm::XtermColor,

    EnumColor
};

use crate::{
    ColorFormattable,
    error::InvalidColorError
};

#[derive(Debug, Clone, PartialEq)]
pub enum NamedColor {
    Ansi(AnsiColor),
    Css(CssColor),
    Style(TextStyle),
    Xterm(XtermColor)
}

impl NamedColor {
    pub fn new(name: &str) -> Result<Self, InvalidColorError> {
        if let Some(ansi) = AnsiColor::from_name(name) {
            return Ok(NamedColor::Ansi(ansi));
        }

        if let Some(css) = CssColor::from_name(name) {
            return Ok(NamedColor::Css(css));
        }

        if let Some(style) = TextStyle::from_name(name) {
            return Ok(NamedColor::Style(style));
        }

        if let Some(style) = XtermColor::from_name(name) {
            return Ok(NamedColor::Xterm(style));
        }

        Err(InvalidColorError::new(name, format!("Unknown named color '{}'", name)))
    }
}

impl ColorFormattable for NamedColor {
    fn format(&self, is_background: bool) -> String {
        match self {
            NamedColor::Ansi(c)  => c.format(is_background),
            NamedColor::Css(c)   => c.format(is_background),
            NamedColor::Style(c) => c.format(is_background),
            NamedColor::Xterm(c) => c.format(is_background)
        }
    }
}