Skip to main content

cargo_fixit/core/
shell.rs

1use anyhow::Context;
2use clap::builder::styling::Style;
3use clap_cargo::style::{ERROR, HEADER, NOTE, WARN};
4use std::io::Write;
5
6use crate::CargoResult;
7
8/// Print a styled action message.
9pub fn status(action: &str, message: impl std::fmt::Display) -> CargoResult<()> {
10    print(action, message, HEADER, true)
11}
12
13/// Print a styled error message.
14pub fn error(message: impl std::fmt::Display) -> CargoResult<()> {
15    print("error", message, ERROR, false)
16}
17
18/// Print a styled warning message.
19pub fn warn(message: impl std::fmt::Display) -> CargoResult<()> {
20    print("warning", message, WARN, false)
21}
22
23/// Print a styled warning message.
24pub fn note(message: impl std::fmt::Display) -> CargoResult<()> {
25    print("note", message, NOTE, false)
26}
27
28/// Print a styled fixed message
29pub fn fixed(file_name: impl std::fmt::Display, fixes: u32) -> CargoResult<()> {
30    status(
31        "Fixed",
32        format!(
33            "{file_name} ({fixes} {})",
34            if fixes == 1 { "fix" } else { "fixes" }
35        ),
36    )
37}
38
39pub fn print_ansi_stderr(message: &[u8]) -> CargoResult<()> {
40    let mut stderr = anstream::stderr().lock();
41    stderr.write_all(message)?;
42    Ok(())
43}
44
45/// Print a message with a colored title in the style of Cargo shell messages.
46fn print(
47    status: &str,
48    message: impl std::fmt::Display,
49    style: Style,
50    justified: bool,
51) -> CargoResult<()> {
52    let mut stderr = anstream::stderr().lock();
53    if justified {
54        write!(stderr, "{style}{status:>12}{style:#}")?;
55    } else {
56        write!(stderr, "{style}{status}{style:#}:")?;
57    }
58
59    writeln!(stderr, " {message:#}").with_context(|| "Failed to write message")?;
60
61    Ok(())
62}