1use crate::font::Font;
2use std::fmt::Display;
3
4#[macro_export]
21macro_rules! cs {
22 ($($arg:tt)*) => {{
23 let mut s = String::new();
24 $crate::wcs!(&mut s, $($arg)*);
25 s
26 }};
27}
28
29#[macro_export]
38macro_rules! pcs {
39 ($($arg:tt)*) => {{
40 let s = $crate::cs!($($arg)*);
41 println!("{s}")
42 }};
43}
44
45#[macro_export]
53macro_rules! epcs {
54 ($($arg:tt)*) => {{
55 let s = $crate::cs!($($arg)*);
56 eprintln!("{s}")
57 }};
58}
59
60#[macro_export]
80macro_rules! wcs {
81 ($buf:expr, $($font:expr),* ; $($arg:tt)*) => {{
82 use std::fmt::Write;
83 $crate::wf!($buf, $($font),*);
84 write!($buf, $($arg)*).unwrap();
85 $buf.push_str("\x1b[0m");
86 }};
87
88 ($buf:expr, $($($font:expr),* => $($s:expr),* );* $(;)?) => {{
89 use std::fmt::Write;
90 $(
91 $crate::wf!($buf, $($font),*);
92 $(write!($buf, "{}", $s).unwrap();)*
93 )*
94 $buf.push_str("\x1b[0m");
95 }};
96}
97
98macro_rules! colored_trait {
99 ($($method:ident => $font:expr),*) => {
100 pub trait Colored:Display {
101 $(
102 fn $method(&self) -> String {
103 $crate::cs!($font => self)
104 }
105 )*
106
107 fn color(&self, r:u8, g:u8, b:u8) -> String {
108 $crate::cs!($crate::color::Font::Color(r,g,b) => self)
109 }
110
111 fn bg_color(&self, r:u8, g:u8, b:u8) -> String {
112 $crate::cs!($crate::color::Font::BgColor(r,g,b) => self)
113 }
114
115 #[allow(clippy::ptr_arg)]
121 fn fonts(&self, mut fonts:String) -> String {
122 use std::fmt::Write;
123 write!(&mut fonts, "{}\x1b[0m", self).unwrap();
124 fonts
125 }
126 }
127 };
128}
129
130impl<T> Colored for T where T: Display + ?Sized {}
132colored_trait! {
133 bold => Font::Bold,
134 underline => Font::Underline,
135 italic => Font::Italic,
136 reverse => Font::Reverse,
137 delete => Font::Delete,
138 black => Font::Black,
139 red => Font::Red,
140 green => Font::Green,
141 yellow => Font::Yellow,
142 blue => Font::Blue,
143 purple => Font::Purple,
144 cyan => Font::Cyan,
145 grey => Font::Grey,
146 bg_black => Font::BgBlack,
147 bg_red => Font::BgRed,
148 bg_green => Font::BgGreen,
149 bg_yellow => Font::BgYellow,
150 bg_blue => Font::BgBlue,
151 bg_purple => Font::BgPurple,
152 bg_cyan => Font::BgCyan,
153 bg_grey => Font::BgGrey
154}