commit 7fa5b5b61b9b4f8f292b794ddda97d4436449683 Author: wpbirney Date: Thu Jun 2 11:58:27 2022 -0400 intial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4fffb2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +/Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..d0311a9 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "mirc" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..3547c41 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,99 @@ +use std::fmt; + +pub enum ColorCode { + White, + Black, + Blue, + Green, + Red, + Brown, + Purple, + Orange, + Yellow, + LightGreen, + Cyan, + LightCyan, + LightBlue, + Pink, + Grey, + LightGrey, + Unset, +} + +impl fmt::Display for ColorCode { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ColorCode::White => write!(f, "00"), + ColorCode::Black => write!(f, "01"), + ColorCode::Blue => write!(f, "02"), + ColorCode::Green => write!(f, "03"), + ColorCode::Red => write!(f, "04"), + ColorCode::Brown => write!(f, "05"), + ColorCode::Purple => write!(f, "06"), + ColorCode::Orange => write!(f, "07"), + ColorCode::Yellow => write!(f, "08"), + ColorCode::LightGreen => write!(f, "09"), + ColorCode::Cyan => write!(f, "10"), + ColorCode::LightCyan => write!(f, "11"), + ColorCode::LightBlue => write!(f, "12"), + ColorCode::Pink => write!(f, "13"), + ColorCode::Grey => write!(f, "14"), + ColorCode::LightGrey => write!(f, "15"), + ColorCode::Unset => Ok(()), + } + } +} + +pub struct Color { + fg: ColorCode, + bg: ColorCode, + content: T, +} + +impl fmt::Display for Color +where + T: fmt::Display, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "\x03{:02}{}\x03", self.fg, self.content) + } +} + +macro_rules! constructors_for { + ($T:ty, $($name:ident: $color:ident),*) => ($( + #[inline] + pub fn $name(content: $T) -> Color<$T> { + Color::new(ColorCode::$color, ColorCode::Unset, content) + } + )*); +} + +impl Color { + pub fn new(fg: ColorCode, bg: ColorCode, content: T) -> Color { + Color { + fg, + bg, + content, + } + } + + constructors_for!( + T, + white: White, + black: Black, + blue: Blue, + green: Green, + red: Red, + brown: Brown, + purple: Purple, + orange: Orange, + yellow: Yellow, + lightgreen: LightGreen, + cyan: Cyan, + lightcyan: LightCyan, + lightblue: LightBlue, + pink: Pink, + grey: Grey, + lightgrey: LightGrey + ); +}