cargo_fixit/core/
shell.rs1use anyhow::Context;
2use clap::builder::styling::Style;
3use clap_cargo::style::{ERROR, HEADER, NOTE, WARN};
4use std::io::Write;
5
6use crate::CargoResult;
7
8pub fn status(action: &str, message: impl std::fmt::Display) -> CargoResult<()> {
10 print(action, message, HEADER, true)
11}
12
13pub fn error(message: impl std::fmt::Display) -> CargoResult<()> {
15 print("error", message, ERROR, false)
16}
17
18pub fn warn(message: impl std::fmt::Display) -> CargoResult<()> {
20 print("warning", message, WARN, false)
21}
22
23pub fn note(message: impl std::fmt::Display) -> CargoResult<()> {
25 print("note", message, NOTE, false)
26}
27
28pub 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
45fn 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}