#[derive(Debug, Copy, Clone, PartialEq)]
pub struct Color {
r: i32,
g: i32,
b: i32,
}
impl Color {
pub fn from(r: i32, g: i32, b: i32) -> Self {
let (mut r, mut g, mut b) = (r, g, b);
if r < 0 {
r = 0;
} else if r > 255 {
r = 255;
}
if g < 0 {
g = 0;
} else if g > 255 {
g = 255;
}
if b < 0 {
b = 0;
} else if b > 255 {
b = 255;
}
Self { r, g, b }
}
pub fn r(&self) -> i32 {
self.r
}
pub fn g(&self) -> i32 {
self.g
}
pub fn b(&self) -> i32 {
self.b
}
pub fn black() -> Self {
Self { r: 0, g: 0, b: 0 }
}
pub fn red() -> Self {
Self { r: 255, g: 0, b: 0 }
}
pub fn green() -> Self {
Self { r: 0, g: 255, b: 0 }
}
pub fn blue() -> Self {
Self { r: 0, g: 0, b: 255 }
}
pub fn white() -> Self {
Self {
r: 255,
g: 255,
b: 255,
}
}
}
#[cfg(test)]
mod tests {
use crate::utils::Color;
#[test]
fn out_of_range() {
assert_eq!(Color::from(-1, -200, -42), Color::black());
assert_eq!(Color::from(300, 300, 300), Color::white());
}
}