From c440f2a7c6a5dc8cf9ae1ad7ab899a0622e5327e Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sat, 25 May 2024 19:59:50 -0400 Subject: [PATCH] refactor: remove ansi_term dependency --- Cargo.lock | 122 +++++++++++------------------ Cargo.toml | 3 +- cli/Cargo.toml | 1 - cli/src/highlight.rs | 156 ++++++++++++++++++++++---------------- cli/src/test.rs | 35 ++++----- cli/src/test_highlight.rs | 14 ++-- cli/src/test_tags.rs | 14 ++-- 7 files changed, 164 insertions(+), 181 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a4ce4075..9ebda504 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,15 +23,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - [[package]] name = "anstream" version = "0.6.14" @@ -151,9 +142,9 @@ checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "block2" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43ff7d91d3c1d568065b06c899777d1e48dcf76103a672a0adbc238a7f247f1e" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ "objc2", ] @@ -408,9 +399,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -470,9 +461,9 @@ dependencies = [ [[package]] name = "either" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] name = "equivalent" @@ -482,9 +473,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -535,9 +526,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -732,9 +723,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.154" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libgit2-sys" @@ -786,9 +777,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.16" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9" +checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" dependencies = [ "cc", "libc", @@ -798,9 +789,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "log" @@ -877,15 +868,15 @@ dependencies = [ [[package]] name = "objc-sys" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da284c198fb9b7b0603f8635185e85fbd5b64ee154b1ed406d489077de2d6d60" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" [[package]] name = "objc2" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b25e1034d0e636cd84707ccdaa9f81243d399196b8a773946dcffec0401659" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" dependencies = [ "objc-sys", "objc2-encode", @@ -893,17 +884,19 @@ dependencies = [ [[package]] name = "objc2-encode" -version = "4.0.1" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88658da63e4cc2c8adb1262902cd6af51094df0488b760d6fd27194269c0950a" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" [[package]] name = "objc2-foundation" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfaefe14254871ea16c7d88968c0ff14ba554712a20d76421eec52f0a7fb8904" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ + "bitflags 2.5.0", "block2", + "libc", "objc2", ] @@ -951,9 +944,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "percent-encoding" @@ -991,9 +984,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.19" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", "syn", @@ -1001,9 +994,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" dependencies = [ "unicode-ident", ] @@ -1139,9 +1132,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -1160,18 +1153,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", @@ -1243,9 +1236,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.60" +version = "2.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" dependencies = [ "proc-macro2", "quote", @@ -1397,7 +1390,6 @@ dependencies = [ name = "tree-sitter-cli" version = "0.22.6" dependencies = [ - "ansi_term", "anstyle", "anyhow", "clap", @@ -1908,22 +1900,6 @@ dependencies = [ "rustix", ] -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - [[package]] name = "winapi-util" version = "0.1.8" @@ -1933,12 +1909,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-sys" version = "0.45.0" @@ -2146,9 +2116,9 @@ checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578" +checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d" dependencies = [ "memchr", ] @@ -2173,18 +2143,18 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zerocopy" -version = "0.7.33" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "087eca3c1eaf8c47b94d02790dd086cd594b912d2043d4de4bfdd466b3befb7c" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.33" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f4b6c273f496d8fd4eaf18853e6b448760225dc030ff2c485a786859aea6393" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 92c04c75..83818835 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,8 +39,7 @@ inherits = "optimize" strip = false [workspace.dependencies] -ansi_term = "0.12.1" -anstyle = "1.0.6" +anstyle = "1.0.7" anyhow = "1.0.86" cc = "1.0.98" clap = { version = "4.5.4", features = [ diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 977caad0..55424666 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -25,7 +25,6 @@ harness = false wasm = ["tree-sitter/wasm", "tree-sitter-loader/wasm"] [dependencies] -ansi_term.workspace = true anstyle.workspace = true anyhow.workspace = true clap.workspace = true diff --git a/cli/src/highlight.rs b/cli/src/highlight.rs index f350778c..dc7216a9 100644 --- a/cli/src/highlight.rs +++ b/cli/src/highlight.rs @@ -1,8 +1,14 @@ use std::{ - collections::HashMap, fmt::Write, fs, io, path, str, sync::atomic::AtomicUsize, time::Instant, + collections::HashMap, + fmt::Write, + fs, + io::{self, Write as _}, + path, str, + sync::atomic::AtomicUsize, + time::Instant, }; -use ansi_term::Color; +use anstyle::{Ansi256Color, AnsiColor, Color, Effects, RgbColor}; use anyhow::Result; use lazy_static::lazy_static; use serde::{ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer}; @@ -43,7 +49,7 @@ lazy_static! { #[derive(Debug, Default)] pub struct Style { - pub ansi: ansi_term::Style, + pub ansi: anstyle::Style, pub css: Option, } @@ -103,30 +109,37 @@ impl Serialize for Theme { let mut map = serializer.serialize_map(Some(self.styles.len()))?; for (name, style) in self.highlight_names.iter().zip(&self.styles) { let style = &style.ansi; - let color = style.foreground.map(|color| match color { - Color::Black => json!("black"), - Color::Blue => json!("blue"), - Color::Cyan => json!("cyan"), - Color::Green => json!("green"), - Color::Purple => json!("purple"), - Color::Red => json!("red"), - Color::White => json!("white"), - Color::Yellow => json!("yellow"), - Color::RGB(r, g, b) => json!(format!("#{:x?}{:x?}{:x?}", r, g, b)), - Color::Fixed(n) => json!(n), + let color = style.get_fg_color().map(|color| match color { + Color::Ansi(color) => match color { + AnsiColor::Black => json!("black"), + AnsiColor::Blue => json!("blue"), + AnsiColor::Cyan => json!("cyan"), + AnsiColor::Green => json!("green"), + AnsiColor::Magenta => json!("purple"), + AnsiColor::Red => json!("red"), + AnsiColor::White => json!("white"), + AnsiColor::Yellow => json!("yellow"), + _ => unreachable!(), + }, + Color::Ansi256(Ansi256Color(n)) => json!(n), + Color::Rgb(RgbColor(r, g, b)) => json!(format!("#{r:x?}{g:x?}{b:x?}")), }); - if style.is_bold || style.is_italic || style.is_underline { + let effects = style.get_effects(); + if effects.contains(Effects::BOLD) + || effects.contains(Effects::ITALIC) + || effects.contains(Effects::UNDERLINE) + { let mut style_json = HashMap::new(); if let Some(color) = color { style_json.insert("color", color); } - if style.is_bold { + if effects.contains(Effects::BOLD) { style_json.insert("bold", Value::Bool(true)); } - if style.is_italic { + if effects.contains(Effects::ITALIC) { style_json.insert("italic", Value::Bool(true)); } - if style.is_underline { + if effects.contains(Effects::UNDERLINE) { style_json.insert("underline", Value::Bool(true)); } map.serialize_entry(&name, &style_json)?; @@ -191,7 +204,7 @@ fn parse_style(style: &mut Style, json: Value) { } "color" => { if let Some(color) = parse_color(value) { - style.ansi = style.ansi.fg(color); + style.ansi = style.ansi.fg_color(Some(color)); } } _ => {} @@ -199,34 +212,36 @@ fn parse_style(style: &mut Style, json: Value) { } style.css = Some(style_to_css(style.ansi)); } else if let Some(color) = parse_color(json) { - style.ansi = style.ansi.fg(color); + style.ansi = style.ansi.fg_color(Some(color)); style.css = Some(style_to_css(style.ansi)); } else { style.css = None; } - if let Some(Color::RGB(red, green, blue)) = style.ansi.foreground { + if let Some(Color::Rgb(RgbColor(red, green, blue))) = style.ansi.get_fg_color() { if !terminal_supports_truecolor() { - style.ansi = style.ansi.fg(closest_xterm_color(red, green, blue)); + style.ansi = style + .ansi + .fg_color(Some(closest_xterm_color(red, green, blue))); } } } fn parse_color(json: Value) -> Option { match json { - Value::Number(n) => n.as_u64().map(|n| Color::Fixed(n as u8)), + Value::Number(n) => n.as_u64().map(|n| Color::Ansi256(Ansi256Color(n as u8))), Value::String(s) => match s.to_lowercase().as_str() { - "black" => Some(Color::Black), - "blue" => Some(Color::Blue), - "cyan" => Some(Color::Cyan), - "green" => Some(Color::Green), - "purple" => Some(Color::Purple), - "red" => Some(Color::Red), - "white" => Some(Color::White), - "yellow" => Some(Color::Yellow), + "black" => Some(Color::Ansi(AnsiColor::Black)), + "blue" => Some(Color::Ansi(AnsiColor::Blue)), + "cyan" => Some(Color::Ansi(AnsiColor::Cyan)), + "green" => Some(Color::Ansi(AnsiColor::Green)), + "purple" => Some(Color::Ansi(AnsiColor::Magenta)), + "red" => Some(Color::Ansi(AnsiColor::Red)), + "white" => Some(Color::Ansi(AnsiColor::White)), + "yellow" => Some(Color::Ansi(AnsiColor::Yellow)), s => { if let Some((red, green, blue)) = hex_string_to_rgb(s) { - Some(Color::RGB(red, green, blue)) + Some(Color::Rgb(RgbColor(red, green, blue))) } else { None } @@ -252,18 +267,19 @@ fn hex_string_to_rgb(s: &str) -> Option<(u8, u8, u8)> { } } -fn style_to_css(style: ansi_term::Style) -> String { +fn style_to_css(style: anstyle::Style) -> String { let mut result = "style='".to_string(); - if style.is_underline { + let effects = style.get_effects(); + if effects.contains(Effects::UNDERLINE) { write!(&mut result, "text-decoration: underline;").unwrap(); } - if style.is_bold { + if effects.contains(Effects::BOLD) { write!(&mut result, "font-weight: bold;").unwrap(); } - if style.is_italic { + if effects.contains(Effects::ITALIC) { write!(&mut result, "font-style: italic;").unwrap(); } - if let Some(color) = style.foreground { + if let Some(color) = style.get_fg_color() { write_color(&mut result, color); } result.push('\''); @@ -271,26 +287,22 @@ fn style_to_css(style: ansi_term::Style) -> String { } fn write_color(buffer: &mut String, color: Color) { - if let Color::RGB(r, g, b) = &color { - write!(buffer, "color: #{r:02x}{g:02x}{b:02x}").unwrap(); - } else { - write!( - buffer, - "color: {}", - match color { - Color::Black => "black", - Color::Blue => "blue", - Color::Red => "red", - Color::Green => "green", - Color::Yellow => "yellow", - Color::Cyan => "cyan", - Color::Purple => "purple", - Color::White => "white", - Color::Fixed(n) => CSS_STYLES_BY_COLOR_ID[n as usize].as_str(), - Color::RGB(_, _, _) => unreachable!(), - } - ) - .unwrap(); + match color { + Color::Ansi(color) => match color { + AnsiColor::Black => write!(buffer, "color: black").unwrap(), + AnsiColor::Red => write!(buffer, "color: red").unwrap(), + AnsiColor::Green => write!(buffer, "color: green").unwrap(), + AnsiColor::Yellow => write!(buffer, "color: yellow").unwrap(), + AnsiColor::Blue => write!(buffer, "color: blue").unwrap(), + AnsiColor::Magenta => write!(buffer, "color: purple").unwrap(), + AnsiColor::Cyan => write!(buffer, "color: cyan").unwrap(), + AnsiColor::White => write!(buffer, "color: white").unwrap(), + _ => unreachable!(), + }, + Color::Ansi256(Ansi256Color(n)) => { + write!(buffer, "color: {}", CSS_STYLES_BY_COLOR_ID[n as usize]).unwrap() + } + Color::Rgb(RgbColor(r, g, b)) => write!(buffer, "color: #{r:02x}{g:02x}{b:02x}").unwrap(), } } @@ -319,7 +331,9 @@ fn closest_xterm_color(red: u8, green: u8, blue: u8) -> Color { (color_id, distance) }); - Color::Fixed(distances.min_by(|(_, d1), (_, d2)| d1.cmp(d2)).unwrap().0) + Color::Ansi256(Ansi256Color( + distances.min_by(|(_, d1), (_, d2)| d1.cmp(d2)).unwrap().0, + )) } pub fn ansi( @@ -349,11 +363,10 @@ pub fn ansi( style_stack.pop(); } HighlightEvent::Source { start, end } => { - style_stack - .last() - .unwrap() - .paint(&source[start..end]) - .write_to(&mut stdout)?; + let style = style_stack.last().unwrap(); + write!(&mut stdout, "{style}").unwrap(); + stdout.write_all(&source[start..end])?; + write!(&mut stdout, "{style:#}").unwrap(); } } } @@ -427,25 +440,34 @@ mod tests { let original_environment_variable = env::var("COLORTERM"); let mut style = Style::default(); - assert_eq!(style.ansi.foreground, None); + assert_eq!(style.ansi.get_fg_color(), None); assert_eq!(style.css, None); // darkcyan is an ANSI color and is preserved env::set_var("COLORTERM", ""); parse_style(&mut style, Value::String(DARK_CYAN.to_string())); - assert_eq!(style.ansi.foreground, Some(Color::Fixed(36))); + assert_eq!( + style.ansi.get_fg_color(), + Some(Color::Ansi256(Ansi256Color(36))) + ); assert_eq!(style.css, Some("style=\'color: #00af87\'".to_string())); // junglegreen is not an ANSI color and is preserved when the terminal supports it env::set_var("COLORTERM", "truecolor"); parse_style(&mut style, Value::String(JUNGLE_GREEN.to_string())); - assert_eq!(style.ansi.foreground, Some(Color::RGB(38, 166, 154))); + assert_eq!( + style.ansi.get_fg_color(), + Some(Color::Rgb(RgbColor(38, 166, 154))) + ); assert_eq!(style.css, Some("style=\'color: #26a69a\'".to_string())); // junglegreen gets approximated as darkcyan when the terminal does not support it env::set_var("COLORTERM", ""); parse_style(&mut style, Value::String(JUNGLE_GREEN.to_string())); - assert_eq!(style.ansi.foreground, Some(Color::Fixed(36))); + assert_eq!( + style.ansi.get_fg_color(), + Some(Color::Ansi256(Ansi256Color(36))) + ); assert_eq!(style.css, Some("style=\'color: #26a69a\'".to_string())); if let Ok(environment_variable) = original_environment_variable { diff --git a/cli/src/test.rs b/cli/src/test.rs index 87ecae52..c0a00f4b 100644 --- a/cli/src/test.rs +++ b/cli/src/test.rs @@ -7,7 +7,7 @@ use std::{ str, }; -use ansi_term::Colour; +use anstyle::{AnsiColor, Color, Style}; use anyhow::{anyhow, Context, Result}; use difference::{Changeset, Difference}; use indoc::indoc; @@ -240,7 +240,7 @@ pub fn get_tmp_test_file(target_test: u32, color: bool) -> Result<(PathBuf, Vec< println!( "{target_test}. {}\n", - opt_color(color, Colour::Green, test_name) + paint(color.then_some(AnsiColor::Green), test_name) ); Ok((test_path, languages)) @@ -270,8 +270,8 @@ pub fn check_queries_at_path(language: &Language, path: &Path) -> Result<()> { pub fn print_diff_key() { println!( "\ncorrect / {} / {}", - Colour::Green.paint("expected"), - Colour::Red.paint("unexpected") + paint(Some(AnsiColor::Green), "expected"), + paint(Some(AnsiColor::Red), "unexpected") ); } @@ -288,14 +288,14 @@ pub fn print_diff(actual: &str, expected: &str, use_color: bool) { } Difference::Add(part) => { if use_color { - print!("{}{}", Colour::Green.paint(part), changeset.split); + println!("{}{}", paint(Some(AnsiColor::Green), part), changeset.split); } else { print!("expected:\n{part}{}", changeset.split); } } Difference::Rem(part) => { if use_color { - print!("{}{}", Colour::Red.paint(part), changeset.split); + println!("{}{}", paint(Some(AnsiColor::Red), part), changeset.split); } else { print!("unexpected:\n{part}{}", changeset.split); } @@ -305,12 +305,9 @@ pub fn print_diff(actual: &str, expected: &str, use_color: bool) { println!(); } -pub fn opt_color(use_color: bool, color: ansi_term::Colour, text: &str) -> String { - if use_color { - color.paint(text).to_string() - } else { - text.to_string() - } +pub fn paint(color: Option, text: &str) -> String { + let style = Style::new().fg_color(color.map(Color::Ansi)); + format!("{style}{text}{style:#}") } /// This will return false if we want to "fail fast". It will bail and not parse any more tests. @@ -340,7 +337,7 @@ fn run_tests( println!( "{:>3}.  {}", opts.test_num, - opt_color(opts.color, Colour::Yellow, &name), + paint(opts.color.then_some(AnsiColor::Yellow), &name), ); return Ok(true); } @@ -349,7 +346,7 @@ fn run_tests( println!( "{:>3}.  {}", opts.test_num, - opt_color(opts.color, Colour::Purple, &name) + paint(opts.color.then_some(AnsiColor::Magenta), &name), ); return Ok(true); } @@ -369,13 +366,13 @@ fn run_tests( println!( "{:>3}.  {}", opts.test_num, - opt_color(opts.color, Colour::Green, &name) + paint(opts.color.then_some(AnsiColor::Green), &name) ); } else { println!( "{:>3}.  {}", opts.test_num, - opt_color(opts.color, Colour::Red, &name) + paint(opts.color.then_some(AnsiColor::Red), &name) ); } @@ -392,7 +389,7 @@ fn run_tests( println!( "{:>3}. ✓ {}", opts.test_num, - opt_color(opts.color, Colour::Green, &name), + paint(opts.color.then_some(AnsiColor::Green), &name) ); if opts.update { let input = String::from_utf8(input.clone()).unwrap(); @@ -438,14 +435,14 @@ fn run_tests( println!( "{:>3}. ✓ {}", opts.test_num, - opt_color(opts.color, Colour::Blue, &name) + paint(opts.color.then_some(AnsiColor::Blue), &name), ); } } else { println!( "{:>3}. ✗ {}", opts.test_num, - opt_color(opts.color, Colour::Red, &name) + paint(opts.color.then_some(AnsiColor::Red), &name), ); } failures.push((name.clone(), actual, output.clone())); diff --git a/cli/src/test_highlight.rs b/cli/src/test_highlight.rs index e8c8cb63..541d98fd 100644 --- a/cli/src/test_highlight.rs +++ b/cli/src/test_highlight.rs @@ -1,6 +1,6 @@ use std::{fs, path::Path}; -use ansi_term::Colour; +use anstyle::AnsiColor; use anyhow::{anyhow, Result}; use tree_sitter::Point; use tree_sitter_highlight::{Highlight, HighlightConfiguration, HighlightEvent, Highlighter}; @@ -8,7 +8,7 @@ use tree_sitter_loader::{Config, Loader}; use super::{ query_testing::{parse_position_comments, Assertion}, - test::opt_color, + test::paint, util, }; @@ -108,9 +108,8 @@ fn test_highlights_indented( Ok(assertion_count) => { println!( "✓ {} ({assertion_count} assertions)", - opt_color( - use_color, - Colour::Green, + paint( + use_color.then_some(AnsiColor::Green), test_file_name.to_string_lossy().as_ref() ), ); @@ -118,9 +117,8 @@ fn test_highlights_indented( Err(e) => { println!( "✗ {}", - opt_color( - use_color, - Colour::Red, + paint( + use_color.then_some(AnsiColor::Red), test_file_name.to_string_lossy().as_ref() ) ); diff --git a/cli/src/test_tags.rs b/cli/src/test_tags.rs index 56e1065b..c5a1dc02 100644 --- a/cli/src/test_tags.rs +++ b/cli/src/test_tags.rs @@ -1,6 +1,6 @@ use std::{fs, path::Path}; -use ansi_term::Colour; +use anstyle::AnsiColor; use anyhow::{anyhow, Result}; use tree_sitter::Point; use tree_sitter_loader::{Config, Loader}; @@ -8,7 +8,7 @@ use tree_sitter_tags::{TagsConfiguration, TagsContext}; use super::{ query_testing::{parse_position_comments, Assertion}, - test::opt_color, + test::paint, util, }; @@ -75,9 +75,8 @@ pub fn test_tags( Ok(assertion_count) => { println!( " ✓ {} ({assertion_count} assertions)", - opt_color( - use_color, - Colour::Green, + paint( + use_color.then_some(AnsiColor::Green), test_file_name.to_string_lossy().as_ref() ), ); @@ -85,9 +84,8 @@ pub fn test_tags( Err(e) => { println!( " ✗ {}", - opt_color( - use_color, - Colour::Red, + paint( + use_color.then_some(AnsiColor::Red), test_file_name.to_string_lossy().as_ref() ) );