#![allow(clippy::trivially_copy_pass_by_ref)]
use std::str::FromStr;
use ncurseswerror::NCurseswError;
use shims::{
constants::{
COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW,
COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE
},
ncurses::short_t
};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[repr(i16)]
pub enum BaseColor {
Black,
Red,
Green,
Yellow,
Blue,
Magenta,
Cyan,
White
}
impl BaseColor {
pub(in crate) fn from_short_t(color: short_t) -> Self {
match color {
COLOR_BLACK => BaseColor::Black,
COLOR_RED => BaseColor::Red,
COLOR_GREEN => BaseColor::Green,
COLOR_YELLOW => BaseColor::Yellow,
COLOR_BLUE => BaseColor::Blue,
COLOR_MAGENTA => BaseColor::Magenta,
COLOR_CYAN => BaseColor::Cyan,
COLOR_WHITE => BaseColor::White,
_ => unreachable!()
}
}
pub(in crate) fn from_i32(color: i32) -> Self {
Self::from_short_t(color as short_t)
}
pub(in crate) fn dark(&self) -> i16 {
match self {
BaseColor::Black => COLOR_BLACK,
BaseColor::Red => COLOR_RED,
BaseColor::Green => COLOR_GREEN,
BaseColor::Yellow => COLOR_YELLOW,
BaseColor::Blue => COLOR_BLUE,
BaseColor::Magenta => COLOR_MAGENTA,
BaseColor::Cyan => COLOR_CYAN,
BaseColor::White => COLOR_WHITE
}
}
pub(in crate) fn light(&self) -> i16 {
self.dark() + COLOR_WHITE + 1
}
}
impl FromStr for BaseColor {
type Err = NCurseswError;
fn from_str(color: &str) -> Result<Self, Self::Err> {
match color {
"black" => Ok(BaseColor::Black),
"red" => Ok(BaseColor::Red),
"green" => Ok(BaseColor::Green),
"yellow" => Ok(BaseColor::Yellow),
"blue" => Ok(BaseColor::Blue),
"magenta" => Ok(BaseColor::Magenta),
"cyan" => Ok(BaseColor::Cyan),
"white" => Ok(BaseColor::White),
_ => Err(NCurseswError::ColorParseError { color: color.to_string() })
}
}
}