|
7 | 7 |
|
8 | 8 | use std::fmt;
|
9 | 9 | use std::io::Write;
|
10 |
| -use termcolor::{Ansi, Color, ColorSpec, NoColor, WriteColor}; |
11 | 10 |
|
12 | 11 | /// A single line change to be applied to the original.
|
13 | 12 | #[derive(Debug, Eq, PartialEq)]
|
@@ -111,42 +110,35 @@ where
|
111 | 110 | }
|
112 | 111 |
|
113 | 112 | pub fn render_colored_changes<T: fmt::Display>(changes: &[Change<T>]) -> String {
|
114 |
| - // termcolor is not very ergonomic, but I don't want to bring in another dependency. |
115 |
| - let mut red = ColorSpec::new(); |
116 |
| - red.set_fg(Some(Color::Red)); |
117 |
| - let mut green = ColorSpec::new(); |
118 |
| - green.set_fg(Some(Color::Green)); |
119 |
| - let mut dim = ColorSpec::new(); |
120 |
| - dim.set_dimmed(true); |
121 |
| - let mut v = Vec::new(); |
122 |
| - let mut result: Box<dyn WriteColor> = if crate::is_ci() { |
| 113 | + // anstyle is not very ergonomic, but I don't want to bring in another dependency. |
| 114 | + let red = anstyle::AnsiColor::Red.on_default().render(); |
| 115 | + let green = anstyle::AnsiColor::Green.on_default().render(); |
| 116 | + let dim = (anstyle::Style::new() | anstyle::Effects::DIMMED).render(); |
| 117 | + let bold = (anstyle::Style::new() | anstyle::Effects::BOLD).render(); |
| 118 | + let reset = anstyle::Reset.render(); |
| 119 | + |
| 120 | + let choice = if crate::is_ci() { |
123 | 121 | // Don't use color on CI. Even though GitHub can display colors, it
|
124 | 122 | // makes reading the raw logs more difficult.
|
125 |
| - Box::new(NoColor::new(&mut v)) |
| 123 | + anstream::ColorChoice::Never |
126 | 124 | } else {
|
127 |
| - Box::new(Ansi::new(&mut v)) |
| 125 | + anstream::AutoStream::choice(&std::io::stdout()) |
128 | 126 | };
|
| 127 | + let mut buffer = anstream::AutoStream::new(anstream::Buffer::new(), choice); |
129 | 128 |
|
130 | 129 | for change in changes {
|
131 | 130 | let (nums, sign, color, text) = match change {
|
132 |
| - Change::Add(i, s) => (format!(" {:<4} ", i), '+', &green, s), |
133 |
| - Change::Remove(i, s) => (format!("{:<4} ", i), '-', &red, s), |
134 |
| - Change::Keep(x, y, s) => (format!("{:<4}{:<4} ", x, y), ' ', &dim, s), |
| 131 | + Change::Add(i, s) => (format!(" {:<4} ", i), '+', green, s), |
| 132 | + Change::Remove(i, s) => (format!("{:<4} ", i), '-', red, s), |
| 133 | + Change::Keep(x, y, s) => (format!("{:<4}{:<4} ", x, y), ' ', dim, s), |
135 | 134 | };
|
136 |
| - result.set_color(&dim).unwrap(); |
137 |
| - write!(result, "{}", nums).unwrap(); |
138 |
| - let mut bold = color.clone(); |
139 |
| - bold.set_bold(true); |
140 |
| - result.set_color(&bold).unwrap(); |
141 |
| - write!(result, "{}", sign).unwrap(); |
142 |
| - result.reset().unwrap(); |
143 |
| - result.set_color(&color).unwrap(); |
144 |
| - write!(result, "{}", text).unwrap(); |
145 |
| - result.reset().unwrap(); |
146 |
| - writeln!(result).unwrap(); |
| 135 | + write!( |
| 136 | + buffer, |
| 137 | + "{dim}{nums}{reset}{bold}{sign}{reset}{color}{text}{reset}" |
| 138 | + ) |
| 139 | + .unwrap(); |
147 | 140 | }
|
148 |
| - drop(result); |
149 |
| - String::from_utf8(v).unwrap() |
| 141 | + String::from_utf8(buffer.into_inner().as_bytes().to_owned()).unwrap() |
150 | 142 | }
|
151 | 143 |
|
152 | 144 | #[cfg(test)]
|
|
0 commit comments