use std::fmt::{self, Debug, Display};
mod colour;
mod modifier;
pub use colour::Colour;
pub use modifier::Modifier;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ColChar {
pub text_char: char,
pub modifier: Modifier,
}
impl ColChar {
pub const SOLID: Self = Self {
text_char: '█',
modifier: Modifier::None,
};
pub const BACKGROUND: Self = Self {
text_char: '░',
modifier: Modifier::None,
};
pub const EMPTY: Self = Self {
text_char: ' ',
modifier: Modifier::None,
};
pub const VOID: Self = Self {
text_char: ' ', modifier: Modifier::None,
};
#[must_use]
pub const fn new(text_char: char, modifier: Modifier) -> Self {
Self {
text_char,
modifier,
}
}
#[must_use]
pub const fn with_char(mut self, text_char: char) -> Self {
self.text_char = text_char;
self
}
#[must_use]
pub const fn with_mod(mut self, modifier: Modifier) -> Self {
self.modifier = modifier;
self
}
#[must_use]
pub const fn with_colour(mut self, colour: Colour) -> Self {
self.modifier = Modifier::Colour(colour);
self
}
#[must_use]
pub const fn with_rgb(mut self, r: u8, g: u8, b: u8) -> Self {
self.modifier = Modifier::from_rgb(r, g, b);
self
}
#[must_use]
pub fn with_hsv(mut self, h: u8, s: u8, v: u8) -> Self {
self.modifier = Modifier::from_hsv(h, s, v);
self
}
pub(crate) fn display_with_prev_and_next(
self,
f: &mut fmt::Formatter,
prev_mod: Option<Modifier>,
next_mod: Option<Modifier>,
) -> fmt::Result {
let modifier = if prev_mod == Some(self.modifier) {
Modifier::None
} else {
self.modifier
};
let end = if next_mod == Some(self.modifier) {
Modifier::None
} else {
Modifier::END
};
write!(f, "{}{}{}", modifier, self.text_char, end)
}
}
impl Default for ColChar {
fn default() -> Self {
Self::SOLID
}
}
impl Display for ColChar {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.modifier {
Modifier::None => write!(f, "{}", self.text_char),
_ => write!(f, "{}{}{}", self.modifier, self.text_char, Modifier::END),
}
}
}