diff --git a/Cargo.toml b/Cargo.toml index 2659c95..a679840 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -96,9 +96,6 @@ replace = """ [Unreleased]: https://github.com/assert-rs/predicates-rs/compare/{{tag_name}}...HEAD""" search = "" -[dependencies.anstyle] -version = "1.0.0" - [dependencies.difflib] version = "0.4" optional = true @@ -121,6 +118,9 @@ version = "1.0" version = "1.0" optional = true +[dependencies.termcolor] +version = "1.2.0" + [dev-dependencies.predicates-tree] version = "1.0" diff --git a/src/color.rs b/src/color.rs index f1b6a21..2b9449c 100644 --- a/src/color.rs +++ b/src/color.rs @@ -1,17 +1,29 @@ -#[derive(Copy, Clone, Debug, Default)] +use std::io::Write; +use termcolor::{Color, ColorSpec, WriteColor}; + +#[derive(Clone, Debug, Default)] pub(crate) struct Palette { - description: anstyle::Style, - var: anstyle::Style, - expected: anstyle::Style, + description: ColorSpec, + var: ColorSpec, + expected: ColorSpec, } impl Palette { pub(crate) fn new(alternate: bool) -> Self { if alternate && cfg!(feature = "color") { Self { - description: anstyle::AnsiColor::Blue.on_default() | anstyle::Effects::BOLD, - var: anstyle::AnsiColor::Red.on_default() | anstyle::Effects::BOLD, - expected: anstyle::AnsiColor::Green.on_default() | anstyle::Effects::BOLD, + description: ColorSpec::new() + .set_fg(Some(Color::Blue)) + .set_bold(true) + .clone(), + var: ColorSpec::new() + .set_fg(Some(Color::Red)) + .set_bold(true) + .clone(), + expected: ColorSpec::new() + .set_fg(Some(Color::Green)) + .set_bold(true) + .clone(), } } else { Self::plain() @@ -26,27 +38,27 @@ impl Palette { } } - pub(crate) fn description(self, display: D) -> Styled { - Styled::new(display, self.description) + pub(crate) fn description(&self, display: D) -> Styled { + Styled::new(display, self.description.clone()) } - pub(crate) fn var(self, display: D) -> Styled { - Styled::new(display, self.var) + pub(crate) fn var(&self, display: D) -> Styled { + Styled::new(display, self.var.clone()) } - pub(crate) fn expected(self, display: D) -> Styled { - Styled::new(display, self.expected) + pub(crate) fn expected(&self, display: D) -> Styled { + Styled::new(display, self.expected.clone()) } } #[derive(Debug)] pub(crate) struct Styled { display: D, - style: anstyle::Style, + style: ColorSpec, } impl Styled { - pub(crate) fn new(display: D, style: anstyle::Style) -> Self { + pub(crate) fn new(display: D, style: ColorSpec) -> Self { Self { display, style } } } @@ -55,10 +67,11 @@ impl std::fmt::Display for Styled { #[inline] fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { if f.alternate() { - write!(f, "{}", self.style.render())?; - self.display.fmt(f)?; - write!(f, "{}", self.style.render_reset())?; - Ok(()) + let mut buf = termcolor::Buffer::ansi(); + buf.set_color(&self.style).unwrap(); + write!(&mut buf, "{}", &self.display).unwrap(); + buf.reset().unwrap(); + write!(f, "{}", String::from_utf8(buf.into_inner()).unwrap()) } else { self.display.fmt(f) }