use pmpx_engine::Event;
use pmpx_plugin::abi::{PMPX_LEVEL_DEBUG, PMPX_LEVEL_ERROR, PMPX_LEVEL_INFO, PMPX_LEVEL_WARN};
use crate::debug;
use crate::error::{error_line, note_line};
pub fn render(plugin: &str, event: Event) -> Rendered {
match event {
Event::PluginMessage { level, text } => {
let line = prefixed(plugin, level, &text);
match level {
PMPX_LEVEL_ERROR => error_line(line),
PMPX_LEVEL_WARN => note_line(line),
_ => debug::note(line),
}
Rendered::Shown
}
Event::Warning(text) => {
note_line(text);
Rendered::Shown
}
Event::Error(text) => {
error_line(text);
Rendered::Shown
}
Event::Note(text) => {
debug::note(text);
Rendered::Shown
}
Event::Phase {
name,
micros,
detail,
} => {
debug::phase(name, micros, detail);
Rendered::Shown
}
Event::Notes { plugin, notes } => {
for note in ¬es {
anstream::eprintln!(
"{}",
crate::style::paint(crate::style::DIM, format!("pmpx: {note}"))
);
}
if !notes.is_empty() {
anstream::eprintln!(
"{}",
crate::style::paint(
crate::style::DIM,
format!(
"pmpx: override it for one run with `pmpx -p <name>`, or pin it in \
.pmpx.toml with `pmpx plugin set {plugin}`"
)
)
);
}
Rendered::Shown
}
Event::Resolved { .. } | Event::Starting { .. } | Event::Finished { .. } => {
Rendered::NotShown
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Rendered {
Shown,
NotShown,
}
pub fn prefixed(plugin: &str, level: u32, message: &str) -> String {
match level {
PMPX_LEVEL_ERROR => format!("[{plugin}] error: {message}"),
PMPX_LEVEL_WARN => format!("[{plugin}] warn: {message}"),
PMPX_LEVEL_INFO | PMPX_LEVEL_DEBUG => format!("[{plugin}] {message}"),
_ => format!("[{plugin}] {message}"),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_level_has_its_own_shape() {
assert_eq!(
prefixed("pnpm", PMPX_LEVEL_ERROR, "boom"),
"[pnpm] error: boom"
);
assert_eq!(prefixed("pnpm", PMPX_LEVEL_WARN, "hmm"), "[pnpm] warn: hmm");
assert_eq!(
prefixed("pnpm", PMPX_LEVEL_INFO, "chose x"),
"[pnpm] chose x"
);
assert_eq!(
prefixed("pnpm", PMPX_LEVEL_DEBUG, "detail"),
"[pnpm] detail"
);
}
#[test]
fn only_the_lines_this_module_owns_are_rendered_here() {
assert_eq!(
render(
"pnpm",
Event::PluginMessage {
level: PMPX_LEVEL_DEBUG,
text: "detail".to_string()
}
),
Rendered::Shown
);
assert_eq!(
render("pnpm", Event::Finished { code: 0 }),
Rendered::NotShown
);
}
}