#![allow(unreadable_literal)]
macro_rules! colour {
($(#[$attr:meta] $constname:ident, $name:ident, $val:expr;)*) => {
impl Colour {
$(
#[$attr]
pub const $constname: Colour = Colour($val);
)*
$(
#[$attr]
#[deprecated(note = "Use the constant instead", since = "0.5.5")]
pub fn $name() -> Colour {
Colour::new($val)
}
)*
}
}
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
pub struct Colour(pub u32);
impl Colour {
#[inline]
pub fn new(value: u32) -> Colour { Colour(value) }
pub fn from_rgb(red: u8, green: u8, blue: u8) -> Colour {
let mut uint = u32::from(red);
uint = (uint << 8) | (u32::from(green));
uint = (uint << 8) | (u32::from(blue));
Colour(uint)
}
pub fn r(&self) -> u8 { ((self.0 >> 16) & 255) as u8 }
pub fn g(&self) -> u8 { ((self.0 >> 8) & 255) as u8 }
pub fn b(&self) -> u8 { (self.0 & 255) as u8 }
pub fn tuple(&self) -> (u8, u8, u8) { (self.r(), self.g(), self.b()) }
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)
}
}
colour! {
BLITZ_BLUE, blitz_blue, 0x6FC6E2;
BLUE, blue, 0x3498DB;
BLURPLE, blurple, 0x7289DA;
DARK_BLUE, dark_blue, 0x206694;
DARK_GOLD, dark_gold, 0xC27C0E;
DARK_GREEN, dark_green, 0x1F8B4C;
DARK_GREY, dark_grey, 0x607D8B;
DARK_MAGENTA, dark_magenta, 0xAD1457;
DARK_ORANGE, dark_orange, 0xA84300;
DARK_PURPLE, dark_purple, 0x71368A;
DARK_RED, dark_red, 0x992D22;
DARK_TEAL, dark_teal, 0x11806A;
DARKER_GREY, darker_grey, 0x546E7A;
FABLED_PINK, fabled_pink, 0xFAB1ED;
FADED_PURPLE, faded_purple, 0x8882C4;
FOOYOO, fooyoo, 0x11CA80;
GOLD, gold, 0xF1C40F;
KERBAL, kerbal, 0xBADA55;
LIGHT_GREY, light_grey, 0x979C9F;
LIGHTER_GREY, lighter_grey, 0x95A5A6;
MAGENTA, magenta, 0xE91E63;
MEIBE_PINK, meibe_pink, 0xE68397;
ORANGE, orange, 0xE67E22;
PURPLE, purple, 0x9B59B6;
RED, red, 0xE74C3C;
ROHRKATZE_BLUE, rohrkatze_blue, 0x7596FF;
ROSEWATER, rosewater, 0xF6DBD8;
TEAL, teal, 0x1ABC9C;
}
impl Default for Colour {
fn default() -> Colour { Colour(0) }
}
#[cfg(test)]
mod test {
use super::Colour;
use std::u32;
#[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);
}
}