1diff --git a/Cargo.lock b/Cargo.lock 2index 078e0b0..76e3a88 100644 3--- a/Cargo.lock 4+++ b/Cargo.lock 5@@ -11,12 +11,6 @@ dependencies = [ 6 "memchr", 7 ] 8 9-[[package]] 10-name = "anstyle" 11-version = "1.0.1" 12-source = "registry+https://github.com/rust-lang/crates.io-index" 13-checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" 14- 15 [[package]] 16 name = "autocfg" 17 version = "1.1.0" 18@@ -78,7 +72,6 @@ dependencies = [ 19 name = "predicates" 20 version = "3.0.4" 21 dependencies = [ 22- "anstyle", 23 "difflib", 24 "float-cmp", 25 "itertools", 26@@ -86,6 +79,7 @@ dependencies = [ 27 "predicates-core", 28 "predicates-tree", 29 "regex", 30+ "termcolor", 31 ] 32 33 [[package]] 34@@ -133,8 +127,48 @@ version = "0.7.4" 35 source = "registry+https://github.com/rust-lang/crates.io-index" 36 checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" 37 38+[[package]] 39+name = "termcolor" 40+version = "1.4.0" 41+source = "registry+https://github.com/rust-lang/crates.io-index" 42+checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" 43+dependencies = [ 44+ "winapi-util", 45+] 46+ 47 [[package]] 48 name = "termtree" 49 version = "0.4.1" 50 source = "registry+https://github.com/rust-lang/crates.io-index" 51 checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" 52+ 53+[[package]] 54+name = "winapi" 55+version = "0.3.9" 56+source = "registry+https://github.com/rust-lang/crates.io-index" 57+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 58+dependencies = [ 59+ "winapi-i686-pc-windows-gnu", 60+ "winapi-x86_64-pc-windows-gnu", 61+] 62+ 63+[[package]] 64+name = "winapi-i686-pc-windows-gnu" 65+version = "0.4.0" 66+source = "registry+https://github.com/rust-lang/crates.io-index" 67+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 68+ 69+[[package]] 70+name = "winapi-util" 71+version = "0.1.6" 72+source = "registry+https://github.com/rust-lang/crates.io-index" 73+checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" 74+dependencies = [ 75+ "winapi", 76+] 77+ 78+[[package]] 79+name = "winapi-x86_64-pc-windows-gnu" 80+version = "0.4.0" 81+source = "registry+https://github.com/rust-lang/crates.io-index" 82+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 83diff --git a/Cargo.toml b/Cargo.toml 84index 2659c95..a679840 100644 85--- a/Cargo.toml 86+++ b/Cargo.toml 87@@ -96,9 +96,6 @@ replace = """ 88 [Unreleased]: https://github.com/assert-rs/predicates-rs/compare/{{tag_name}}...HEAD""" 89 search = "<!-- next-url -->" 90 91-[dependencies.anstyle] 92-version = "1.0.0" 93- 94 [dependencies.difflib] 95 version = "0.4" 96 optional = true 97@@ -121,6 +118,9 @@ version = "1.0" 98 version = "1.0" 99 optional = true 100 101+[dependencies.termcolor] 102+version = "1.2.0" 103+ 104 [dev-dependencies.predicates-tree] 105 version = "1.0" 106 107diff --git a/patches/use-termcolor.patch b/patches/use-termcolor.patch 108index 9831f7d..e69de29 100644 109--- a/patches/use-termcolor.patch 110+++ b/patches/use-termcolor.patch 111@@ -1,111 +0,0 @@ 112---- a/Android.bp 2023-11-07 14:29:55.304929829 +0100 113-+++ b/Android.bp 2023-11-07 14:30:05.916987569 +0100 114-@@ -16,7 +16,7 @@ 115- "regex", 116- ], 117- rustlibs: [ 118-- "libanstyle", 119-+ "libtermcolor", 120- "libitertools", 121- "libpredicates_core", 122- "libregex", 123-@@ -47,7 +47,7 @@ 124- "regex", 125- ], 126- rustlibs: [ 127-- "libanstyle", 128-+ "libtermcolor", 129- "libitertools", 130- "libpredicates_core", 131- "libpredicates_tree", 132---- a/src/color.rs 2006-07-24 03:21:28.000000000 +0200 133-+++ b/src/color.rs 2023-11-07 14:26:51.131915579 +0100 134-@@ -1,17 +1,29 @@ 135--#[derive(Copy, Clone, Debug, Default)] 136-+use std::io::Write; 137-+use termcolor::{Color, ColorSpec, WriteColor}; 138-+ 139-+#[derive(Clone, Debug, Default)] 140- pub(crate) struct Palette { 141-- description: anstyle::Style, 142-- var: anstyle::Style, 143-- expected: anstyle::Style, 144-+ description: ColorSpec, 145-+ var: ColorSpec, 146-+ expected: ColorSpec, 147- } 148- 149- impl Palette { 150- pub(crate) fn new(alternate: bool) -> Self { 151- if alternate && cfg!(feature = "color") { 152- Self { 153-- description: anstyle::AnsiColor::Blue.on_default() | anstyle::Effects::BOLD, 154-- var: anstyle::AnsiColor::Red.on_default() | anstyle::Effects::BOLD, 155-- expected: anstyle::AnsiColor::Green.on_default() | anstyle::Effects::BOLD, 156-+ description: ColorSpec::new() 157-+ .set_fg(Some(Color::Blue)) 158-+ .set_bold(true) 159-+ .clone(), 160-+ var: ColorSpec::new() 161-+ .set_fg(Some(Color::Red)) 162-+ .set_bold(true) 163-+ .clone(), 164-+ expected: ColorSpec::new() 165-+ .set_fg(Some(Color::Green)) 166-+ .set_bold(true) 167-+ .clone(), 168- } 169- } else { 170- Self::plain() 171-@@ -26,27 +38,27 @@ 172- } 173- } 174- 175-- pub(crate) fn description<D: std::fmt::Display>(self, display: D) -> Styled<D> { 176-- Styled::new(display, self.description) 177-+ pub(crate) fn description<D: std::fmt::Display>(&self, display: D) -> Styled<D> { 178-+ Styled::new(display, self.description.clone()) 179- } 180- 181-- pub(crate) fn var<D: std::fmt::Display>(self, display: D) -> Styled<D> { 182-- Styled::new(display, self.var) 183-+ pub(crate) fn var<D: std::fmt::Display>(&self, display: D) -> Styled<D> { 184-+ Styled::new(display, self.var.clone()) 185- } 186- 187-- pub(crate) fn expected<D: std::fmt::Display>(self, display: D) -> Styled<D> { 188-- Styled::new(display, self.expected) 189-+ pub(crate) fn expected<D: std::fmt::Display>(&self, display: D) -> Styled<D> { 190-+ Styled::new(display, self.expected.clone()) 191- } 192- } 193- 194- #[derive(Debug)] 195- pub(crate) struct Styled<D> { 196- display: D, 197-- style: anstyle::Style, 198-+ style: ColorSpec, 199- } 200- 201- impl<D: std::fmt::Display> Styled<D> { 202-- pub(crate) fn new(display: D, style: anstyle::Style) -> Self { 203-+ pub(crate) fn new(display: D, style: ColorSpec) -> Self { 204- Self { display, style } 205- } 206- } 207-@@ -55,10 +67,11 @@ 208- #[inline] 209- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 210- if f.alternate() { 211-- write!(f, "{}", self.style.render())?; 212-- self.display.fmt(f)?; 213-- write!(f, "{}", self.style.render_reset())?; 214-- Ok(()) 215-+ let mut buf = termcolor::Buffer::ansi(); 216-+ buf.set_color(&self.style).unwrap(); 217-+ write!(&mut buf, "{}", &self.display).unwrap(); 218-+ buf.reset().unwrap(); 219-+ write!(f, "{}", String::from_utf8(buf.into_inner()).unwrap()) 220- } else { 221- self.display.fmt(f) 222- } 223diff --git a/src/color.rs b/src/color.rs 224index f1b6a21..2b9449c 100644 225--- a/src/color.rs 226+++ b/src/color.rs 227@@ -1,17 +1,29 @@ 228-#[derive(Copy, Clone, Debug, Default)] 229+use std::io::Write; 230+use termcolor::{Color, ColorSpec, WriteColor}; 231+ 232+#[derive(Clone, Debug, Default)] 233 pub(crate) struct Palette { 234- description: anstyle::Style, 235- var: anstyle::Style, 236- expected: anstyle::Style, 237+ description: ColorSpec, 238+ var: ColorSpec, 239+ expected: ColorSpec, 240 } 241 242 impl Palette { 243 pub(crate) fn new(alternate: bool) -> Self { 244 if alternate && cfg!(feature = "color") { 245 Self { 246- description: anstyle::AnsiColor::Blue.on_default() | anstyle::Effects::BOLD, 247- var: anstyle::AnsiColor::Red.on_default() | anstyle::Effects::BOLD, 248- expected: anstyle::AnsiColor::Green.on_default() | anstyle::Effects::BOLD, 249+ description: ColorSpec::new() 250+ .set_fg(Some(Color::Blue)) 251+ .set_bold(true) 252+ .clone(), 253+ var: ColorSpec::new() 254+ .set_fg(Some(Color::Red)) 255+ .set_bold(true) 256+ .clone(), 257+ expected: ColorSpec::new() 258+ .set_fg(Some(Color::Green)) 259+ .set_bold(true) 260+ .clone(), 261 } 262 } else { 263 Self::plain() 264@@ -26,27 +38,27 @@ impl Palette { 265 } 266 } 267 268- pub(crate) fn description<D: std::fmt::Display>(self, display: D) -> Styled<D> { 269- Styled::new(display, self.description) 270+ pub(crate) fn description<D: std::fmt::Display>(&self, display: D) -> Styled<D> { 271+ Styled::new(display, self.description.clone()) 272 } 273 274- pub(crate) fn var<D: std::fmt::Display>(self, display: D) -> Styled<D> { 275- Styled::new(display, self.var) 276+ pub(crate) fn var<D: std::fmt::Display>(&self, display: D) -> Styled<D> { 277+ Styled::new(display, self.var.clone()) 278 } 279 280- pub(crate) fn expected<D: std::fmt::Display>(self, display: D) -> Styled<D> { 281- Styled::new(display, self.expected) 282+ pub(crate) fn expected<D: std::fmt::Display>(&self, display: D) -> Styled<D> { 283+ Styled::new(display, self.expected.clone()) 284 } 285 } 286 287 #[derive(Debug)] 288 pub(crate) struct Styled<D> { 289 display: D, 290- style: anstyle::Style, 291+ style: ColorSpec, 292 } 293 294 impl<D: std::fmt::Display> Styled<D> { 295- pub(crate) fn new(display: D, style: anstyle::Style) -> Self { 296+ pub(crate) fn new(display: D, style: ColorSpec) -> Self { 297 Self { display, style } 298 } 299 } 300@@ -55,10 +67,11 @@ impl<D: std::fmt::Display> std::fmt::Display for Styled<D> { 301 #[inline] 302 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 303 if f.alternate() { 304- write!(f, "{}", self.style.render())?; 305- self.display.fmt(f)?; 306- write!(f, "{}", self.style.render_reset())?; 307- Ok(()) 308+ let mut buf = termcolor::Buffer::ansi(); 309+ buf.set_color(&self.style).unwrap(); 310+ write!(&mut buf, "{}", &self.display).unwrap(); 311+ buf.reset().unwrap(); 312+ write!(f, "{}", String::from_utf8(buf.into_inner()).unwrap()) 313 } else { 314 self.display.fmt(f) 315 } 316