ansee/src/lib.rs

137 lines
2.9 KiB
Rust

#[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"
)
}
}