1diff --git a/Cargo.toml b/Cargo.toml 2index 2659c95..a679840 100644 3--- a/Cargo.toml 4+++ b/Cargo.toml 5@@ -96,9 +96,6 @@ replace = """ 6 [Unreleased]: https://github.com/assert-rs/predicates-rs/compare/{{tag_name}}...HEAD""" 7 search = "<!-- next-url -->" 8 9-[dependencies.anstyle] 10-version = "1.0.0" 11- 12 [dependencies.difflib] 13 version = "0.4" 14 optional = true 15@@ -121,6 +118,9 @@ version = "1.0" 16 version = "1.0" 17 optional = true 18 19+[dependencies.termcolor] 20+version = "1.2.0" 21+ 22 [dev-dependencies.predicates-tree] 23 version = "1.0" 24 25diff --git a/src/color.rs b/src/color.rs 26index f1b6a21..2b9449c 100644 27--- a/src/color.rs 28+++ b/src/color.rs 29@@ -1,17 +1,29 @@ 30-#[derive(Copy, Clone, Debug, Default)] 31+use std::io::Write; 32+use termcolor::{Color, ColorSpec, WriteColor}; 33+ 34+#[derive(Clone, Debug, Default)] 35 pub(crate) struct Palette { 36- description: anstyle::Style, 37- var: anstyle::Style, 38- expected: anstyle::Style, 39+ description: ColorSpec, 40+ var: ColorSpec, 41+ expected: ColorSpec, 42 } 43 44 impl Palette { 45 pub(crate) fn new(alternate: bool) -> Self { 46 if alternate && cfg!(feature = "color") { 47 Self { 48- description: anstyle::AnsiColor::Blue.on_default() | anstyle::Effects::BOLD, 49- var: anstyle::AnsiColor::Red.on_default() | anstyle::Effects::BOLD, 50- expected: anstyle::AnsiColor::Green.on_default() | anstyle::Effects::BOLD, 51+ description: ColorSpec::new() 52+ .set_fg(Some(Color::Blue)) 53+ .set_bold(true) 54+ .clone(), 55+ var: ColorSpec::new() 56+ .set_fg(Some(Color::Red)) 57+ .set_bold(true) 58+ .clone(), 59+ expected: ColorSpec::new() 60+ .set_fg(Some(Color::Green)) 61+ .set_bold(true) 62+ .clone(), 63 } 64 } else { 65 Self::plain() 66@@ -26,27 +38,27 @@ impl Palette { 67 } 68 } 69 70- pub(crate) fn description<D: std::fmt::Display>(self, display: D) -> Styled<D> { 71- Styled::new(display, self.description) 72+ pub(crate) fn description<D: std::fmt::Display>(&self, display: D) -> Styled<D> { 73+ Styled::new(display, self.description.clone()) 74 } 75 76- pub(crate) fn var<D: std::fmt::Display>(self, display: D) -> Styled<D> { 77- Styled::new(display, self.var) 78+ pub(crate) fn var<D: std::fmt::Display>(&self, display: D) -> Styled<D> { 79+ Styled::new(display, self.var.clone()) 80 } 81 82- pub(crate) fn expected<D: std::fmt::Display>(self, display: D) -> Styled<D> { 83- Styled::new(display, self.expected) 84+ pub(crate) fn expected<D: std::fmt::Display>(&self, display: D) -> Styled<D> { 85+ Styled::new(display, self.expected.clone()) 86 } 87 } 88 89 #[derive(Debug)] 90 pub(crate) struct Styled<D> { 91 display: D, 92- style: anstyle::Style, 93+ style: ColorSpec, 94 } 95 96 impl<D: std::fmt::Display> Styled<D> { 97- pub(crate) fn new(display: D, style: anstyle::Style) -> Self { 98+ pub(crate) fn new(display: D, style: ColorSpec) -> Self { 99 Self { display, style } 100 } 101 } 102@@ -55,10 +67,11 @@ impl<D: std::fmt::Display> std::fmt::Display for Styled<D> { 103 #[inline] 104 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 105 if f.alternate() { 106- write!(f, "{}", self.style.render())?; 107- self.display.fmt(f)?; 108- write!(f, "{}", self.style.render_reset())?; 109- Ok(()) 110+ let mut buf = termcolor::Buffer::ansi(); 111+ buf.set_color(&self.style).unwrap(); 112+ write!(&mut buf, "{}", &self.display).unwrap(); 113+ buf.reset().unwrap(); 114+ write!(f, "{}", String::from_utf8(buf.into_inner()).unwrap()) 115 } else { 116 self.display.fmt(f) 117 } 118