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)
}
}
}