From c13c875d3ed0192b3ccd817984f80083f3586618 Mon Sep 17 00:00:00 2001 From: Michael Pfaff Date: Fri, 23 Dec 2022 20:44:23 -0500 Subject: [PATCH] Initial commit --- .gitignore | 2 + Cargo.toml | 8 +++ examples/print.rs | 28 ++++++++++ src/lib.rs | 136 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 174 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 examples/print.rs create mode 100644 src/lib.rs 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..ea6b2fb --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "ansee" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/examples/print.rs b/examples/print.rs new file mode 100644 index 0000000..62848e3 --- /dev/null +++ b/examples/print.rs @@ -0,0 +1,28 @@ +use ansee::*; + +fn main() { + // black, red, green, yellow, blue, purple, cyan, white + println!(styled!(bold, black, "Hello, World!")); + println!(styled!(black, "Hello, World!")); + + println!(styled!(bold, red, "Hello, World!")); + println!(styled!(red, "Hello, World!")); + + println!(styled!(bold, green, "Hello, World!")); + println!(styled!(green, "Hello, World!")); + + println!(styled!(bold, yellow, "Hello, World!")); + println!(styled!(yellow, "Hello, World!")); + + println!(styled!(bold, blue, "Hello, World!")); + println!(styled!(blue, "Hello, World!")); + + println!(styled!(bold, purple, "Hello, World!")); + println!(styled!(purple, "Hello, World!")); + + println!(styled!(bold, cyan, "Hello, World!")); + println!(styled!(cyan, "Hello, World!")); + + println!(styled!(bold, white, "Hello, World!")); + println!(styled!(white, "Hello, World!")); +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..389b9f1 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,136 @@ +#[macro_export] +macro_rules! __ansi_esc { + () => { + "\x1B" + }; +} +pub use __ansi_esc as esc; + +#[macro_export] +macro_rules! __ansi_csi { + () => { + ::std::concat!($crate::esc!(), "[") + }; +} +pub use __ansi_csi as csi; + +#[macro_export] +macro_rules! __ansi_style_code { + ($code:literal) => { + ::std::concat!($code) + }; + ($code:literal, $($codes:tt)+) => { + ::std::concat!($code, ";", $crate::style_code!($( $codes )+)) + }; + ($code:ident, $($codes:tt)+) => { + ::std::concat!($crate::style_code!($code), ";", $crate::style_code!($( $codes )+)) + }; + + (reset) => { + $crate::style_code!(0) + }; + + (bold) => { + $crate::style_code!(1) + }; + (faint) => { + $crate::style_code!(2) + }; + (italic) => { + $crate::style_code!(3) + }; + (underline) => { + $crate::style_code!(4) + }; + (blink) => { + $crate::style_code!(5) + }; + (negative) => { + $crate::style_code!(7) + }; + (crossed) => { + $crate::style_code!(9) + }; + + (black) => { + // BACKGROUND COLOR + $crate::style_code!(30) + }; + (red) => { + $crate::style_code!(31) + }; + (green) => { + $crate::style_code!(32) + }; + (yellow) => { + $crate::style_code!(33) + }; + (blue) => { + $crate::style_code!(34) + }; + (purple) => { + $crate::style_code!(35) + }; + (cyan) => { + $crate::style_code!(36) + }; + (white) => { + $crate::style_code!(37) + }; +} +pub use __ansi_style_code as style_code; + +#[macro_export] +macro_rules! __ansi_style { + ($( $tt:tt )+) => { + ::std::concat!($crate::csi!(), $crate::style_code!($( $tt )+), "m") + }; +} +pub use __ansi_style as style; + +#[macro_export] +macro_rules! __ansi_styled { + ( [$( $style:tt )+], $fmt:literal ) => { + ::std::concat!($crate::style!($( $style )+), $fmt, $crate::style!(reset)) + }; + ( [$( $style:tt )+], $fmt:literal, $( $args:tt )+ ) => { + ::std::format!($crate::styled!([$( $style )+], $fmt), $( $args )+) + }; + + ( $( $style:ident, )+ $fmt:literal ) => { + $crate::styled!([$( $style ),+], $fmt) + }; + ( $( $style:ident, )+ $fmt:literal, $( $args:tt )+ ) => { + $crate::styled!([$( $style ),+], $fmt, $( $args )+) + }; +} +pub use __ansi_styled as styled; + +#[macro_export] +macro_rules! __ansi_define { + ( $name:ident = $( $style:tt )+ ) => { + $crate::define!(@ $name = [ $( $style )+ ], $); + }; + (@ $name:ident = [ $( $style:tt )+ ], $dol:tt) => { + #[macro_export] + macro_rules! $name { + ($dol( $tokens:tt )+) => { + $crate::styled!([$( $style )+], $dol( $tokens )+) + }; + } + }; +} +pub use __ansi_define as define; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn styled_literal() { + assert_eq!( + styled!(bold, green, "Hello, World!"), + "\x1B[1;32mHello, World!\x1B[0m" + ) + } +}