Skip to content

Commit 89b2a43

Browse files
committed
feat(shell): Allow colored messages
1 parent b3353c8 commit 89b2a43

File tree

1 file changed

+26
-55
lines changed

1 file changed

+26
-55
lines changed

src/cargo/core/shell.rs

Lines changed: 26 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ impl fmt::Debug for Shell {
7878
/// A `Write`able object, either with or without color support
7979
enum ShellOut {
8080
/// A plain write object without color support
81-
Write(Box<dyn Write>),
81+
Write(AutoStream<Box<dyn Write>>),
8282
/// Color-enabled stdio, with information on whether color should be used
8383
Stream {
8484
stdout: AutoStream<std::io::Stdout>,
@@ -121,7 +121,7 @@ impl Shell {
121121
/// Creates a shell from a plain writable object, with no color, and max verbosity.
122122
pub fn from_write(out: Box<dyn Write>) -> Shell {
123123
Shell {
124-
output: ShellOut::Write(out),
124+
output: ShellOut::Write(AutoStream::never(out)), // strip all formatting on write
125125
verbosity: Verbosity::Verbose,
126126
needs_clear: false,
127127
}
@@ -398,72 +398,43 @@ impl ShellOut {
398398
style: &Style,
399399
justified: bool,
400400
) -> CargoResult<()> {
401-
match *self {
402-
ShellOut::Stream { ref mut stderr, .. } => {
403-
let style = style.render();
404-
let bold = (anstyle::Style::new() | anstyle::Effects::BOLD).render();
405-
let reset = anstyle::Reset.render();
406-
407-
let mut buffer = Vec::new();
408-
if justified {
409-
write!(&mut buffer, "{style}{status:>12}{reset}")?;
410-
} else {
411-
write!(&mut buffer, "{style}{status}{reset}{bold}:{reset}")?;
412-
}
413-
match message {
414-
Some(message) => writeln!(buffer, " {message}")?,
415-
None => write!(buffer, " ")?,
416-
}
417-
stderr.write_all(&buffer)?;
418-
}
419-
ShellOut::Write(ref mut w) => {
420-
if justified {
421-
write!(w, "{:>12}", status)?;
422-
} else {
423-
write!(w, "{}:", status)?;
424-
}
425-
match message {
426-
Some(message) => writeln!(w, " {}", message)?,
427-
None => write!(w, " ")?,
428-
}
429-
}
401+
let style = style.render();
402+
let bold = (anstyle::Style::new() | anstyle::Effects::BOLD).render();
403+
let reset = anstyle::Reset.render();
404+
405+
let mut buffer = Vec::new();
406+
if justified {
407+
write!(&mut buffer, "{style}{status:>12}{reset}")?;
408+
} else {
409+
write!(&mut buffer, "{style}{status}{reset}{bold}:{reset}")?;
410+
}
411+
match message {
412+
Some(message) => writeln!(buffer, " {message}")?,
413+
None => write!(buffer, " ")?,
430414
}
415+
self.stderr().write_all(&buffer)?;
431416
Ok(())
432417
}
433418

434419
/// Write a styled fragment
435420
fn write_stdout(&mut self, fragment: impl fmt::Display, style: &Style) -> CargoResult<()> {
436-
match *self {
437-
ShellOut::Stream { ref mut stdout, .. } => {
438-
let style = style.render();
439-
let reset = anstyle::Reset.render();
421+
let style = style.render();
422+
let reset = anstyle::Reset.render();
440423

441-
let mut buffer = Vec::new();
442-
write!(buffer, "{style}{}{reset}", fragment)?;
443-
stdout.write_all(&buffer)?;
444-
}
445-
ShellOut::Write(ref mut w) => {
446-
write!(w, "{}", fragment)?;
447-
}
448-
}
424+
let mut buffer = Vec::new();
425+
write!(buffer, "{style}{}{reset}", fragment)?;
426+
self.stdout().write_all(&buffer)?;
449427
Ok(())
450428
}
451429

452430
/// Write a styled fragment
453431
fn write_stderr(&mut self, fragment: impl fmt::Display, style: &Style) -> CargoResult<()> {
454-
match *self {
455-
ShellOut::Stream { ref mut stderr, .. } => {
456-
let style = style.render();
457-
let reset = anstyle::Reset.render();
432+
let style = style.render();
433+
let reset = anstyle::Reset.render();
458434

459-
let mut buffer = Vec::new();
460-
write!(buffer, "{style}{}{reset}", fragment)?;
461-
stderr.write_all(&buffer)?;
462-
}
463-
ShellOut::Write(ref mut w) => {
464-
write!(w, "{}", fragment)?;
465-
}
466-
}
435+
let mut buffer = Vec::new();
436+
write!(buffer, "{style}{}{reset}", fragment)?;
437+
self.stderr().write_all(&buffer)?;
467438
Ok(())
468439
}
469440

0 commit comments

Comments
 (0)