allow user to use hex colors in config (#486)

This commit is contained in:
Darren Schroeder 2021-12-13 09:02:54 -06:00 committed by GitHub
parent ee6ab17fde
commit 3701fd1d76
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -15,72 +15,97 @@ use std::collections::HashMap;
// } // }
pub fn lookup_ansi_color_style(s: String) -> Style { pub fn lookup_ansi_color_style(s: String) -> Style {
match s.as_str() { if s.starts_with('#') {
"g" | "green" => Color::Green.normal(), match color_from_hex(&s) {
"gb" | "green_bold" => Color::Green.bold(), Ok(c) => match c {
"gu" | "green_underline" => Color::Green.underline(), Some(c) => c.normal(),
"gi" | "green_italic" => Color::Green.italic(), None => Style::default(),
"gd" | "green_dimmed" => Color::Green.dimmed(), },
"gr" | "green_reverse" => Color::Green.reverse(), Err(_) => Style::default(),
"gbl" | "green_blink" => Color::Green.blink(), }
"gst" | "green_strike" => Color::Green.strikethrough(), } else {
"r" | "red" => Color::Red.normal(), match s.as_str() {
"rb" | "red_bold" => Color::Red.bold(), "g" | "green" => Color::Green.normal(),
"ru" | "red_underline" => Color::Red.underline(), "gb" | "green_bold" => Color::Green.bold(),
"ri" | "red_italic" => Color::Red.italic(), "gu" | "green_underline" => Color::Green.underline(),
"rd" | "red_dimmed" => Color::Red.dimmed(), "gi" | "green_italic" => Color::Green.italic(),
"rr" | "red_reverse" => Color::Red.reverse(), "gd" | "green_dimmed" => Color::Green.dimmed(),
"rbl" | "red_blink" => Color::Red.blink(), "gr" | "green_reverse" => Color::Green.reverse(),
"rst" | "red_strike" => Color::Red.strikethrough(), "gbl" | "green_blink" => Color::Green.blink(),
"u" | "blue" => Color::Blue.normal(), "gst" | "green_strike" => Color::Green.strikethrough(),
"ub" | "blue_bold" => Color::Blue.bold(), "r" | "red" => Color::Red.normal(),
"uu" | "blue_underline" => Color::Blue.underline(), "rb" | "red_bold" => Color::Red.bold(),
"ui" | "blue_italic" => Color::Blue.italic(), "ru" | "red_underline" => Color::Red.underline(),
"ud" | "blue_dimmed" => Color::Blue.dimmed(), "ri" | "red_italic" => Color::Red.italic(),
"ur" | "blue_reverse" => Color::Blue.reverse(), "rd" | "red_dimmed" => Color::Red.dimmed(),
"ubl" | "blue_blink" => Color::Blue.blink(), "rr" | "red_reverse" => Color::Red.reverse(),
"ust" | "blue_strike" => Color::Blue.strikethrough(), "rbl" | "red_blink" => Color::Red.blink(),
"b" | "black" => Color::Black.normal(), "rst" | "red_strike" => Color::Red.strikethrough(),
"bb" | "black_bold" => Color::Black.bold(), "u" | "blue" => Color::Blue.normal(),
"bu" | "black_underline" => Color::Black.underline(), "ub" | "blue_bold" => Color::Blue.bold(),
"bi" | "black_italic" => Color::Black.italic(), "uu" | "blue_underline" => Color::Blue.underline(),
"bd" | "black_dimmed" => Color::Black.dimmed(), "ui" | "blue_italic" => Color::Blue.italic(),
"br" | "black_reverse" => Color::Black.reverse(), "ud" | "blue_dimmed" => Color::Blue.dimmed(),
"bbl" | "black_blink" => Color::Black.blink(), "ur" | "blue_reverse" => Color::Blue.reverse(),
"bst" | "black_strike" => Color::Black.strikethrough(), "ubl" | "blue_blink" => Color::Blue.blink(),
"y" | "yellow" => Color::Yellow.normal(), "ust" | "blue_strike" => Color::Blue.strikethrough(),
"yb" | "yellow_bold" => Color::Yellow.bold(), "b" | "black" => Color::Black.normal(),
"yu" | "yellow_underline" => Color::Yellow.underline(), "bb" | "black_bold" => Color::Black.bold(),
"yi" | "yellow_italic" => Color::Yellow.italic(), "bu" | "black_underline" => Color::Black.underline(),
"yd" | "yellow_dimmed" => Color::Yellow.dimmed(), "bi" | "black_italic" => Color::Black.italic(),
"yr" | "yellow_reverse" => Color::Yellow.reverse(), "bd" | "black_dimmed" => Color::Black.dimmed(),
"ybl" | "yellow_blink" => Color::Yellow.blink(), "br" | "black_reverse" => Color::Black.reverse(),
"yst" | "yellow_strike" => Color::Yellow.strikethrough(), "bbl" | "black_blink" => Color::Black.blink(),
"p" | "purple" => Color::Purple.normal(), "bst" | "black_strike" => Color::Black.strikethrough(),
"pb" | "purple_bold" => Color::Purple.bold(), "y" | "yellow" => Color::Yellow.normal(),
"pu" | "purple_underline" => Color::Purple.underline(), "yb" | "yellow_bold" => Color::Yellow.bold(),
"pi" | "purple_italic" => Color::Purple.italic(), "yu" | "yellow_underline" => Color::Yellow.underline(),
"pd" | "purple_dimmed" => Color::Purple.dimmed(), "yi" | "yellow_italic" => Color::Yellow.italic(),
"pr" | "purple_reverse" => Color::Purple.reverse(), "yd" | "yellow_dimmed" => Color::Yellow.dimmed(),
"pbl" | "purple_blink" => Color::Purple.blink(), "yr" | "yellow_reverse" => Color::Yellow.reverse(),
"pst" | "purple_strike" => Color::Purple.strikethrough(), "ybl" | "yellow_blink" => Color::Yellow.blink(),
"c" | "cyan" => Color::Cyan.normal(), "yst" | "yellow_strike" => Color::Yellow.strikethrough(),
"cb" | "cyan_bold" => Color::Cyan.bold(), "p" | "purple" => Color::Purple.normal(),
"cu" | "cyan_underline" => Color::Cyan.underline(), "pb" | "purple_bold" => Color::Purple.bold(),
"ci" | "cyan_italic" => Color::Cyan.italic(), "pu" | "purple_underline" => Color::Purple.underline(),
"cd" | "cyan_dimmed" => Color::Cyan.dimmed(), "pi" | "purple_italic" => Color::Purple.italic(),
"cr" | "cyan_reverse" => Color::Cyan.reverse(), "pd" | "purple_dimmed" => Color::Purple.dimmed(),
"cbl" | "cyan_blink" => Color::Cyan.blink(), "pr" | "purple_reverse" => Color::Purple.reverse(),
"cst" | "cyan_strike" => Color::Cyan.strikethrough(), "pbl" | "purple_blink" => Color::Purple.blink(),
"w" | "white" => Color::White.normal(), "pst" | "purple_strike" => Color::Purple.strikethrough(),
"wb" | "white_bold" => Color::White.bold(), "c" | "cyan" => Color::Cyan.normal(),
"wu" | "white_underline" => Color::White.underline(), "cb" | "cyan_bold" => Color::Cyan.bold(),
"wi" | "white_italic" => Color::White.italic(), "cu" | "cyan_underline" => Color::Cyan.underline(),
"wd" | "white_dimmed" => Color::White.dimmed(), "ci" | "cyan_italic" => Color::Cyan.italic(),
"wr" | "white_reverse" => Color::White.reverse(), "cd" | "cyan_dimmed" => Color::Cyan.dimmed(),
"wbl" | "white_blink" => Color::White.blink(), "cr" | "cyan_reverse" => Color::Cyan.reverse(),
"wst" | "white_strike" => Color::White.strikethrough(), "cbl" | "cyan_blink" => Color::Cyan.blink(),
_ => Color::White.normal(), "cst" | "cyan_strike" => Color::Cyan.strikethrough(),
"w" | "white" => Color::White.normal(),
"wb" | "white_bold" => Color::White.bold(),
"wu" | "white_underline" => Color::White.underline(),
"wi" | "white_italic" => Color::White.italic(),
"wd" | "white_dimmed" => Color::White.dimmed(),
"wr" | "white_reverse" => Color::White.reverse(),
"wbl" | "white_blink" => Color::White.blink(),
"wst" | "white_strike" => Color::White.strikethrough(),
_ => Color::White.normal(),
}
}
}
fn color_from_hex(hex_color: &str) -> std::result::Result<Option<Color>, std::num::ParseIntError> {
// right now we only allow hex colors with hashtag and 6 characters
let trimmed = hex_color.trim_matches('#');
if trimmed.len() != 6 {
Ok(None)
} else {
// make a nu_ansi_term::Color::Rgb color by converting hex to decimal
Ok(Some(Color::Rgb(
u8::from_str_radix(&trimmed[..2], 16)?,
u8::from_str_radix(&trimmed[2..4], 16)?,
u8::from_str_radix(&trimmed[4..6], 16)?,
)))
} }
} }