From 3384c0658483ba91dbf2e4af16849aa2414ffb76 Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Tue, 2 Jun 2020 18:39:18 -0700 Subject: [PATCH] fix color intensity (#23) * fix color intensity * update test expected strings * bump version for new release --- Cargo.toml | 4 ++-- src/lib.rs | 36 ++++++++++++++++++++++++++++++++++-- src/section/help.rs | 26 +++++++++++++++++--------- tests/minimal.rs | 19 ++----------------- 4 files changed, 55 insertions(+), 30 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8943d75..14ad325 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "color-eyre" -version = "0.3.2" +version = "0.3.3" authors = ["Jane Lusby "] edition = "2018" license = "MIT OR Apache-2.0" @@ -22,7 +22,7 @@ color-backtrace = "0.4.0" backtrace = "0.3.48" indenter = "0.3.0" ansi_term = "0.12.1" -color-spantrace = { version = "0.1.1", optional = true } +color-spantrace = { version = "0.1.2", optional = true } once_cell = "1.4.0" [dev-dependencies] diff --git a/src/lib.rs b/src/lib.rs index 6c994c5..f0d39ba 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -202,7 +202,7 @@ //! [`examples/custom_filter.rs`]: https://github.com/yaahc/color-eyre/blob/master/examples/custom_filter.rs //! [`examples/custom_section.rs`]: https://github.com/yaahc/color-eyre/blob/master/examples/custom_section.rs //! [`examples/multiple_errors.rs`]: https://github.com/yaahc/color-eyre/blob/master/examples/multiple_errors.rs -#![doc(html_root_url = "https://docs.rs/color-eyre/0.3.2")] +#![doc(html_root_url = "https://docs.rs/color-eyre/0.3.3")] #![cfg_attr(docsrs, feature(doc_cfg))] #![warn( missing_debug_implementations, @@ -420,7 +420,7 @@ impl EyreHandler for Handler { buf.clear(); write!(&mut buf, "{}", error).unwrap(); writeln!(f)?; - write!(indented(f).ind(n), "{}", Red.paint(&buf))?; + write!(indented(f).ind(n), "{}", Red.make_intense().paint(&buf))?; } let separated = &mut HeaderWriter { @@ -640,3 +640,35 @@ pub type Report = eyre::Report; /// } /// ``` pub type Result = core::result::Result; + +// TODO: remove when / if ansi_term merges these changes upstream +trait ColorExt { + fn make_intense(self) -> Self; +} + +impl ColorExt for ansi_term::Color { + fn make_intense(self) -> Self { + use ansi_term::Color::*; + + match self { + Black => Fixed(8), + Red => Fixed(9), + Green => Fixed(10), + Yellow => Fixed(11), + Blue => Fixed(12), + Purple => Fixed(13), + Cyan => Fixed(14), + White => Fixed(15), + Fixed(color) if color < 8 => Fixed(color + 8), + other => other, + } + } +} +impl ColorExt for ansi_term::Style { + fn make_intense(mut self) -> Self { + if let Some(color) = self.foreground { + self.foreground = Some(color.make_intense()); + } + self + } +} diff --git a/src/section/help.rs b/src/section/help.rs index 8915392..48ce0f8 100644 --- a/src/section/help.rs +++ b/src/section/help.rs @@ -1,4 +1,5 @@ -//! Provides an extension trait for attaching `Section`s to error reports. +//! Provides an extension trait for attaching `Section` to error reports. +use crate::ColorExt; use crate::{Report, Result}; use ansi_term::Color::*; use indenter::indented; @@ -351,23 +352,30 @@ pub(crate) enum HelpInfo { impl Display for HelpInfo { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - HelpInfo::Note(n) => write!(f, "{}: {}", Cyan.paint("Note"), n), - HelpInfo::Warning(w) => write!(f, "{}: {}", Yellow.paint("Warning"), w), - HelpInfo::Suggestion(s) => write!(f, "{}: {}", Cyan.paint("Suggestion"), s), - HelpInfo::Custom(c) => write!(f, "{}", c), - HelpInfo::Error(e) => { + HelpInfo::Note(note) => write!(f, "{}: {}", Cyan.make_intense().paint("Note"), note), + HelpInfo::Warning(warning) => { + write!(f, "{}: {}", Yellow.make_intense().paint("Warning"), warning) + } + HelpInfo::Suggestion(suggestion) => write!( + f, + "{}: {}", + Cyan.make_intense().paint("Suggestion"), + suggestion + ), + HelpInfo::Custom(section) => write!(f, "{}", section), + HelpInfo::Error(error) => { // a lot here let errors = std::iter::successors( - Some(e.as_ref() as &(dyn std::error::Error + 'static)), + Some(error.as_ref() as &(dyn std::error::Error + 'static)), |e| e.source(), ); write!(f, "Error:")?; let mut buf = String::new(); - for (n, e) in errors.enumerate() { + for (n, error) in errors.enumerate() { writeln!(f)?; buf.clear(); - write!(&mut buf, "{}", e).unwrap(); + write!(&mut buf, "{}", error).unwrap(); write!(indented(f).ind(n), "{}", Red.paint(&buf))?; } diff --git a/tests/minimal.rs b/tests/minimal.rs index 511b4b6..e8abb9b 100644 --- a/tests/minimal.rs +++ b/tests/minimal.rs @@ -53,22 +53,7 @@ fn read_config() -> Result<(), Report> { // Define at the bottom to prevent it from changing line numbers #[cfg(feature = "capture-spantrace")] -static EXPECTED: &str = "Error: - 0: \u{1b}[31mUnable to read config\u{1b}[0m - 1: \u{1b}[31mNo such file or directory (os error 2)\u{1b}[0m - - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SPANTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - 0: \u{1b}[31mminimal\u{1b}[0m\u{1b}[31m::\u{1b}[0m\u{1b}[31mread_file\u{1b}[0m with \u{1b}[36mpath=\"fake_file\"\u{1b}[0m - at tests/minimal.rs:41 - 1: \u{1b}[31mminimal\u{1b}[0m\u{1b}[31m::\u{1b}[0m\u{1b}[31mread_config\u{1b}[0m - at tests/minimal.rs:47 - -\u{1b}[36mSuggestion\u{1b}[0m: try using a file that exists next time"; +static EXPECTED: &str = "Error: \n 0: \u{1b}[38;5;9mUnable to read config\u{1b}[0m\n 1: \u{1b}[38;5;9mNo such file or directory (os error 2)\u{1b}[0m\n\n ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SPANTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n \n 0: \u{1b}[38;5;9mminimal\u{1b}[0m\u{1b}[38;5;9m::\u{1b}[0m\u{1b}[38;5;9mread_file\u{1b}[0m with \u{1b}[38;5;14mpath=\"fake_file\"\u{1b}[0m\n at tests/minimal.rs:41\n 1: \u{1b}[38;5;9mminimal\u{1b}[0m\u{1b}[38;5;9m::\u{1b}[0m\u{1b}[38;5;9mread_config\u{1b}[0m\n at tests/minimal.rs:47\n\n\u{1b}[38;5;14mSuggestion\u{1b}[0m: try using a file that exists next time"; #[cfg(not(feature = "capture-spantrace"))] -static EXPECTED: &str = "Error: - 0: \u{1b}[31mUnable to read config\u{1b}[0m - 1: \u{1b}[31mNo such file or directory (os error 2)\u{1b}[0m - -\u{1b}[36mSuggestion\u{1b}[0m: try using a file that exists next time"; +static EXPECTED: &str = "Error: \n 0: \u{1b}[38;5;9mUnable to read config\u{1b}[0m\n 1: \u{1b}[38;5;9mNo such file or directory (os error 2)\u{1b}[0m\n\n\u{1b}[38;5;14mSuggestion\u{1b}[0m: try using a file that exists next time";