master
rascul 2 days ago
commit 90cc6bc41c

@ -0,0 +1,6 @@
[*]
indent_style = tab
tab_width = 4
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

1
.gitignore vendored

@ -0,0 +1 @@
/target

16
Cargo.lock generated

@ -0,0 +1,16 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "color"
version = "0.1.0"
dependencies = [
"libc",
]
[[package]]
name = "libc"
version = "0.2.180"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"

@ -0,0 +1,7 @@
[package]
name = "color"
version = "0.1.0"
edition = "2024"
[dependencies]
libc = "0.2.180"

@ -0,0 +1,127 @@
use color::{Color, NO_COLOR, TTY};
fn main() {
println!("NO_COLOR: {:?}", *NO_COLOR);
println!("TTY: {:?}", *TTY);
println!("\nColor\tBold\tLine\tStrike\tItalic\tBg");
println!(
"{}Black\t{}Black{}\t{}Black{}\t{}Black{}\t{}Black{}\t{}{}Black{}",
Color::Black,
Color::Bold,
Color::ResetBold,
Color::Line,
Color::ResetLine,
Color::Strike,
Color::ResetStrike,
Color::Italic,
Color::Reset,
Color::White,
Color::BgBlack,
Color::Reset
);
println!(
"{}Red\t{}Red{}\t{}Red{}\t{}Red{}\t{}Red{}\t{}{}Red{}",
Color::Red,
Color::Bold,
Color::ResetBold,
Color::Line,
Color::ResetLine,
Color::Strike,
Color::ResetStrike,
Color::Italic,
Color::Reset,
Color::White,
Color::BgRed,
Color::Reset
);
println!(
"{}Green\t{}Green{}\t{}Green{}\t{}Green{}\t{}Red{}\t{}{}Green{}",
Color::Green,
Color::Bold,
Color::ResetBold,
Color::Line,
Color::ResetLine,
Color::Strike,
Color::ResetStrike,
Color::Italic,
Color::Reset,
Color::White,
Color::BgGreen,
Color::Reset
);
println!(
"{}Yellow\t{}Yellow{}\t{}Yellow{}\t{}Yellow{}\t{}Red{}\t{}{}Yellow{}",
Color::Yellow,
Color::Bold,
Color::ResetBold,
Color::Line,
Color::ResetLine,
Color::Strike,
Color::ResetStrike,
Color::Italic,
Color::Reset,
Color::White,
Color::BgYellow,
Color::Reset
);
println!(
"{}Blue\t{}Blue{}\t{}Blue{}\t{}Blue{}\t{}Red{}\t{}{}Blue{}",
Color::Blue,
Color::Bold,
Color::ResetBold,
Color::Line,
Color::ResetLine,
Color::Strike,
Color::ResetStrike,
Color::Italic,
Color::Reset,
Color::White,
Color::BgBlue,
Color::Reset
);
println!(
"{}Purple\t{}Purple{}\t{}Purple{}\t{}Purple{}\t{}Red{}\t{}{}Purple{}",
Color::Purple,
Color::Bold,
Color::ResetBold,
Color::Line,
Color::ResetLine,
Color::Strike,
Color::ResetStrike,
Color::Italic,
Color::Reset,
Color::White,
Color::BgPurple,
Color::Reset
);
println!(
"{}Cyan\t{}Cyan{}\t{}Cyan{}\t{}Cyan{}\t{}Red{}\t{}{}Cyan{}",
Color::Cyan,
Color::Bold,
Color::ResetBold,
Color::Line,
Color::ResetLine,
Color::Strike,
Color::ResetStrike,
Color::Italic,
Color::Reset,
Color::White,
Color::BgCyan,
Color::Reset
);
println!(
"{}White\t{}White{}\t{}White{}\t{}White{}\t{}Red{}\t{}{}White{}",
Color::White,
Color::Bold,
Color::ResetBold,
Color::Line,
Color::ResetLine,
Color::Strike,
Color::ResetStrike,
Color::Italic,
Color::Reset,
Color::Black,
Color::BgWhite,
Color::Reset
);
}

@ -0,0 +1,78 @@
use libc::{STDOUT_FILENO, isatty};
use std::env::var_os;
use std::sync::LazyLock;
pub static NO_COLOR: LazyLock<bool> = LazyLock::new(|| var_os("NO_COLOR").is_some());
pub static TTY: LazyLock<bool> = LazyLock::new(|| unsafe { isatty(STDOUT_FILENO) } != 0);
pub enum Color {
Black,
Red,
Green,
Yellow,
Blue,
Purple,
Cyan,
White,
BgBlack,
BgRed,
BgGreen,
BgYellow,
BgBlue,
BgPurple,
BgCyan,
BgWhite,
Bold,
Italic,
Line,
Strike,
Reset,
ResetBold,
ResetItalic,
ResetLine,
ResetStrike,
}
impl std::fmt::Display for Color {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
impl Color {
fn as_str(&self) -> &'static str {
if *NO_COLOR || !*TTY {
""
} else {
match self {
Self::Black => "\x1b[0;30m",
Self::Red => "\x1b[0;31m",
Self::Green => "\x1b[0;32m",
Self::Yellow => "\x1b[0;33m",
Self::Blue => "\x1b[0;34m",
Self::Purple => "\x1b[0;35m",
Self::Cyan => "\x1b[0;36m",
Self::White => "\x1b[0;37m",
Self::BgBlack => "\x1b[40m",
Self::BgRed => "\x1b[0;41m",
Self::BgGreen => "\x1b[42m",
Self::BgYellow => "\x1b[43m",
Self::BgBlue => "\x1b[44m",
Self::BgPurple => "\x1b[45m",
Self::BgCyan => "\x1b[46m",
Self::BgWhite => "\x1b[47m",
Self::Bold => "\x1b[1m",
Self::Italic => "\x1b[3m",
Self::Line => "\x1b[4m",
Self::Strike => "\x1b[9m",
Self::Reset => "\x1b[0m",
Self::ResetBold => "\x1b[22m",
Self::ResetItalic => "\x1b[23m",
Self::ResetLine => "\x1b[24m",
Self::ResetStrike => "\x1b[29m",
}
}
}
}
Loading…
Cancel
Save