use core::fmt; use crate::color::{Bold, Dim, Fg, Reset}; use crate::domain; use crate::palette; use crate::severity::Severity; const SPACES: &str = " "; fn write_padding(w: &mut dyn fmt::Write, n: usize) -> fmt::Result { w.write_str(&SPACES[..n.min(SPACES.len())]) } pub fn write_gutter( w: &mut dyn fmt::Write, domain: &str, severity: Severity, message: fmt::Arguments<'_>, gutter_width: usize, ) -> fmt::Result { let group = domain::classify(domain); let label_color = group.label_color(); let msg_color = severity.message_color(); let padding = gutter_width.saturating_sub(domain.len() + 1); write_padding(w, padding)?; write!( w, "{}{}{}{} {}|{} {}{}{}", Bold, Fg(label_color), domain, Reset, Fg(palette::BAR_DIM), Reset, Fg(msg_color), message, Reset ) } pub fn write_message_only( w: &mut dyn fmt::Write, severity: Severity, message: fmt::Arguments<'_>, ) -> fmt::Result { write!(w, "{}{}{}", Fg(severity.message_color()), message, Reset) } pub fn write_gutter_label( w: &mut dyn fmt::Write, domain: &str, dim: bool, gutter_width: usize, ) -> fmt::Result { let group = domain::classify(domain); let label_color = group.label_color(); let padding = gutter_width.saturating_sub(domain.len() + 1); write_padding(w, padding)?; match dim { true => write!( w, "{}{}{}{} {}|{} ", Dim, Fg(label_color), domain, Reset, Fg(palette::BAR_DIM), Reset ), false => write!( w, "{}{}{}{} {}|{} ", Bold, Fg(label_color), domain, Reset, Fg(palette::BAR_DIM), Reset ), } } pub fn write_continuation(w: &mut dyn fmt::Write, gutter_width: usize) -> fmt::Result { write_padding(w, gutter_width)?; write!(w, "{}|{} ", Fg(palette::BAR_DIM), Reset) }