#![allow(clippy::unreadable_literal)]
#[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd, Deserialize, Serialize)]
#[cfg_attr(feature = "typesize", derive(typesize::derive::TypeSize))]
pub struct Colour(pub u32);
pub type Color = Colour;
impl Colour {
#[inline]
#[must_use]
pub const fn new(value: u32) -> Colour {
Colour(value)
}
#[allow(clippy::cast_lossless)]
#[must_use]
pub const fn from_rgb(red: u8, green: u8, blue: u8) -> Colour {
Colour(((red as u32) << 16) | ((green as u32) << 8) | blue as u32)
}
#[must_use]
pub const fn r(self) -> u8 {
((self.0 >> 16) & 255) as u8
}
#[must_use]
pub const fn g(self) -> u8 {
((self.0 >> 8) & 255) as u8
}
#[must_use]
pub const fn b(self) -> u8 {
(self.0 & 255) as u8
}
#[must_use]
pub const fn tuple(self) -> (u8, u8, u8) {
(self.r(), self.g(), self.b())
}
#[must_use]
pub fn hex(self) -> String {
format!("{:06X}", self.0)
}
}
impl From<i32> for Colour {
fn from(value: i32) -> Colour {
Colour(value as u32)
}
}
impl From<u32> for Colour {
fn from(value: u32) -> Colour {
Colour(value)
}
}
impl From<u64> for Colour {
fn from(value: u64) -> Colour {
Colour(value as u32)
}
}
impl From<(u8, u8, u8)> for Colour {
fn from((red, green, blue): (u8, u8, u8)) -> Self {
Colour::from_rgb(red, green, blue)
}
}
impl Colour {
pub const BLITZ_BLUE: Colour = Colour(0x6FC6E2);
pub const BLUE: Colour = Colour(0x3498DB);
pub const BLURPLE: Colour = Colour(0x7289DA);
pub const DARK_BLUE: Colour = Colour(0x206694);
pub const DARK_GOLD: Colour = Colour(0xC27C0E);
pub const DARK_GREEN: Colour = Colour(0x1F8B4C);
pub const DARK_GREY: Colour = Colour(0x607D8B);
pub const DARK_MAGENTA: Colour = Colour(0xAD1457);
pub const DARK_ORANGE: Colour = Colour(0xA84300);
pub const DARK_PURPLE: Colour = Colour(0x71368A);
pub const DARK_RED: Colour = Colour(0x992D22);
pub const DARK_TEAL: Colour = Colour(0x11806A);
pub const DARKER_GREY: Colour = Colour(0x546E7A);
pub const FABLED_PINK: Colour = Colour(0xFAB1ED);
pub const FADED_PURPLE: Colour = Colour(0x8882C4);
pub const FOOYOO: Colour = Colour(0x11CA80);
pub const GOLD: Colour = Colour(0xF1C40F);
pub const KERBAL: Colour = Colour(0xBADA55);
pub const LIGHT_GREY: Colour = Colour(0x979C9F);
pub const LIGHTER_GREY: Colour = Colour(0x95A5A6);
pub const MAGENTA: Colour = Colour(0xE91E63);
pub const MEIBE_PINK: Colour = Colour(0xE68397);
pub const ORANGE: Colour = Colour(0xE67E22);
pub const PURPLE: Colour = Colour(0x9B59B6);
pub const RED: Colour = Colour(0xE74C3C);
pub const ROHRKATZE_BLUE: Colour = Colour(0x7596FF);
pub const ROSEWATER: Colour = Colour(0xF6DBD8);
pub const TEAL: Colour = Colour(0x1ABC9C);
}
pub mod colours {
pub mod branding {
use super::super::Colour;
pub const BLURPLE: Colour = Colour(0x5865F2);
pub const GREEN: Colour = Colour(0x57F287);
pub const YELLOW: Colour = Colour(0xFEE75C);
pub const FUCHSIA: Colour = Colour(0xEB459E);
pub const RED: Colour = Colour(0xED4245);
pub const WHITE: Colour = Colour(0xFFFFFF);
pub const BLACK: Colour = Colour(0x23272A);
}
pub mod css {
use super::super::Colour;
pub const POSITIVE: Colour = Colour(0x3BA55D);
pub const WARNING: Colour = Colour(0xFAA81A);
pub const DANGER: Colour = Colour(0xED4245);
}
pub mod roles {
use super::super::Colour;
pub const DEFAULT: Colour = Colour(0x99AAB5);
pub const TEAL: Colour = Colour(0x1ABC9C);
pub const DARK_TEAL: Colour = Colour(0x11806A);
pub const GREEN: Colour = Colour(0x2ECC71);
pub const DARK_GREEN: Colour = Colour(0x1F8B4C);
pub const BLUE: Colour = Colour(0x3498DB);
pub const DARK_BLUE: Colour = Colour(0x206694);
pub const PURPLE: Colour = Colour(0x9B59B6);
pub const DARK_PURPLE: Colour = Colour(0x71368A);
pub const MAGENTA: Colour = Colour(0xE91E63);
pub const DARK_MAGENTA: Colour = Colour(0xAD1457);
pub const GOLD: Colour = Colour(0xF1C40F);
pub const DARK_GOLD: Colour = Colour(0xC27C0E);
pub const ORANGE: Colour = Colour(0xE67E22);
pub const DARK_ORANGE: Colour = Colour(0xA84300);
pub const RED: Colour = Colour(0xE74C3C);
pub const DARK_RED: Colour = Colour(0x992D22);
pub const LIGHTER_GREY: Colour = Colour(0x95A5A6);
pub const LIGHT_GREY: Colour = Colour(0x979C9F);
pub const DARK_GREY: Colour = Colour(0x607D8B);
pub const DARKER_GREY: Colour = Colour(0x546E7A);
}
}
#[cfg(test)]
mod test {
use super::Colour;
#[test]
fn new() {
assert_eq!(Colour::new(1).0, 1);
assert_eq!(Colour::new(u32::MIN).0, u32::MIN);
assert_eq!(Colour::new(u32::MAX).0, u32::MAX);
}
#[test]
fn from_rgb() {
assert_eq!(Colour::from_rgb(255, 0, 0).0, 0xFF0000);
assert_eq!(Colour::from_rgb(0, 255, 0).0, 0x00FF00);
assert_eq!(Colour::from_rgb(0, 0, 255).0, 0x0000FF);
}
#[test]
fn r() {
assert_eq!(Colour::new(0x336123).r(), 0x33);
}
#[test]
fn g() {
assert_eq!(Colour::new(0x336123).g(), 0x61);
}
#[test]
fn b() {
assert_eq!(Colour::new(0x336123).b(), 0x23);
}
#[test]
fn tuple() {
assert_eq!(Colour::new(0x336123).tuple(), (0x33, 0x61, 0x23));
}
#[test]
fn default() {
assert_eq!(Colour::default().0, 0);
}
#[test]
fn from() {
assert_eq!(Colour::from(7i32).0, 7);
assert_eq!(Colour::from(7u32).0, 7);
assert_eq!(Colour::from(7u64).0, 7);
}
}