line_ui/style/
color.rs

1/*
2 * Copyright (c) 2025 Jasmine Tai. All rights reserved.
3 */
4
5/// A terminal color, which can be applied to the foreground or background.
6///
7/// Note that some distinct values of [`Color`] could end up appearing as the
8/// same color when displayed in the terminal. However, the [`PartialEq`]
9/// implementation does not account for this; it only compares the
10/// representation of the enum.
11///
12/// [`From`] implementations are provided for convenience.
13///
14/// # Example
15///
16/// ```
17/// use line_ui::Color;
18///
19/// assert_eq!(Color::Default, Color::default());
20/// assert_eq!(Color::Ansi(42), 42.into());
21/// assert_eq!(Color::Rgb(20, 40, 90), (20, 40, 90).into());
22/// ```
23#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
24#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25#[non_exhaustive]
26pub enum Color {
27    /// The default color used by the terminal.
28    #[default]
29    Default,
30    /// An ANSI color code.
31    Ansi(u8),
32    /// An RGB color.
33    Rgb(u8, u8, u8),
34}
35
36#[allow(missing_docs)]
37impl Color {
38    pub const BLACK: Color = Color::Ansi(0);
39    pub const RED: Color = Color::Ansi(1);
40    pub const GREEN: Color = Color::Ansi(2);
41    pub const YELLOW: Color = Color::Ansi(3);
42    pub const BLUE: Color = Color::Ansi(4);
43    pub const MAGENTA: Color = Color::Ansi(5);
44    pub const CYAN: Color = Color::Ansi(6);
45    pub const WHITE: Color = Color::Ansi(7);
46    pub const LIGHT_BLACK: Color = Color::Ansi(8);
47    pub const LIGHT_RED: Color = Color::Ansi(9);
48    pub const LIGHT_GREEN: Color = Color::Ansi(10);
49    pub const LIGHT_YELLOW: Color = Color::Ansi(11);
50    pub const LIGHT_BLUE: Color = Color::Ansi(12);
51    pub const LIGHT_MAGENTA: Color = Color::Ansi(13);
52    pub const LIGHT_CYAN: Color = Color::Ansi(14);
53    pub const LIGHT_WHITE: Color = Color::Ansi(15);
54}
55
56impl From<u8> for Color {
57    fn from(value: u8) -> Self {
58        Color::Ansi(value)
59    }
60}
61
62impl From<(u8, u8, u8)> for Color {
63    fn from((r, g, b): (u8, u8, u8)) -> Self {
64        Color::Rgb(r, g, b)
65    }
66}