colorlib 1.0.0

A color management library for LynxFetch.
Documentation
// SPDX-FileCopyrightText: 2023 CELESTIFYX Team
// SPDX-License-Identifier: GPL-3.0-or-later

use serde::Deserialize;
use std::str::FromStr;
use colored::ColoredString;
use colored::Colorize;

#[derive(Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum Color {
	Black,
	Red,
	Green,
	Yellow,
	Blue,
	Magenta,
	Cyan,
	White,
	HotPink,
	Purple,
	DarkTeal,
	Gray,
	Teal,
	Orange,
	Lime,
	Brown,
	Beige,
	Ivory,
	Pink,
	Peach,
	Lavender,
	Mint,
	Gold,
	LightGreen,
	Clear
}

impl FromStr for Color {
	type Err = ();

	fn from_str(color: &str) -> Result<Self, Self::Err> {
		match color.to_lowercase().as_str() {
			"black"      => Ok(Color::Black),
			"red"        => Ok(Color::Red),
			"green"      => Ok(Color::Green),
			"yellow"     => Ok(Color::Yellow),
			"blue"       => Ok(Color::Blue),
			"magenta"    => Ok(Color::Magenta),
			"cyan"       => Ok(Color::Cyan),
			"white"      => Ok(Color::White),
			"hotpink"    => Ok(Color::HotPink),
			"purple"     => Ok(Color::Purple),
			"darkteal"   => Ok(Color::DarkTeal),
			"gray"       => Ok(Color::Gray),
			"teal"       => Ok(Color::Teal),
			"orange"     => Ok(Color::Orange),
			"lime"       => Ok(Color::Lime),
			"brown"      => Ok(Color::Brown),
			"beige"      => Ok(Color::Beige),
			"ivory"      => Ok(Color::Ivory),
			"pink"       => Ok(Color::Pink),
			"peach"      => Ok(Color::Peach),
			"lavender"   => Ok(Color::Lavender),
			"mint"       => Ok(Color::Mint),
			"gold"       => Ok(Color::Gold),
			"lightgreen" => Ok(Color::LightGreen),
			"clear"      => Ok(Color::Clear),

			_            => Err(())
		}
	}
}

impl Color {
	pub fn color_string(&self, string: &str) -> ColoredString {
		let colors: [(Color, ColoredString); 25] = [
			(Color::Black, string.black()),
			(Color::Red, string.red()),
			(Color::Green, string.green()),
			(Color::Yellow, string.yellow()),
			(Color::Blue, string.blue()),
			(Color::Magenta, string.magenta()),
			(Color::Cyan, string.cyan()),
			(Color::White, string.white()),
			(Color::HotPink, string.truecolor(255, 105, 180)),
			(Color::Purple, string.truecolor(168, 134, 192)),
			(Color::DarkTeal, string.truecolor(0, 70, 79)),
			(Color::Gray, string.truecolor(128, 128, 128)),
			(Color::Teal, string.truecolor(0, 128, 128)),
			(Color::Orange, string.truecolor(255, 165, 0)),
			(Color::Lime, string.truecolor(50, 205, 50)),
			(Color::Brown, string.truecolor(150, 75, 0)),
			(Color::Beige, string.truecolor(245, 245, 220)),
			(Color::Ivory, string.truecolor(255, 255, 240)),
			(Color::Pink, string.truecolor(255, 192, 203)),
			(Color::Peach, string.truecolor(255, 229, 180)),
			(Color::Lavender, string.truecolor(230, 230, 250)),
			(Color::Mint, string.truecolor(152, 255, 152)),
			(Color::Gold, string.truecolor(255, 215, 0)),
			(Color::LightGreen, string.truecolor(143, 191, 80)),
			(Color::Clear, string.clear())
		];

		colors.iter().find(|(c, _)| c == self).map(|(_, s)| s.clone().bold()).unwrap_or(string.clear())
	}
}