36 lines
995 B
Rust
36 lines
995 B
Rust
//! Tiny stderr logger. We use a consistent `==> <action>: <details>` prefix
|
|
//! so progress messages are easy to scan during long builds.
|
|
|
|
use std::io::{IsTerminal, Write};
|
|
|
|
const ARROW: &str = "==>";
|
|
|
|
fn paint(color: &str, text: &str) -> String {
|
|
if std::io::stderr().is_terminal() {
|
|
format!("\x1b[{color}m{text}\x1b[0m")
|
|
} else {
|
|
text.to_owned()
|
|
}
|
|
}
|
|
|
|
fn emit(color: &str, action: &str, details: &str) {
|
|
let arrow = paint(color, ARROW);
|
|
let action = paint("1", action);
|
|
let _ = writeln!(std::io::stderr(), "{arrow} {action} {details}");
|
|
}
|
|
|
|
/// Major step, e.g. starting a build or packaging an output.
|
|
pub fn step(action: &str, details: &str) {
|
|
emit("1;34", action, details); // bold blue
|
|
}
|
|
|
|
/// Cache hit / skipped work.
|
|
pub fn skip(action: &str, details: &str) {
|
|
emit("1;33", action, details); // bold yellow
|
|
}
|
|
|
|
/// Sub-step inside a larger action.
|
|
pub fn info(action: &str, details: &str) {
|
|
emit("1;32", action, details); // bold green
|
|
}
|