cargo_fixit/core/
shell.rs

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