Nothing to see here, move along
1use core::fmt;
2
3use crate::color::{Bold, Dim, Fg, Reset};
4use crate::domain;
5use crate::palette;
6use crate::severity::Severity;
7
8const SPACES: &str = " ";
9
10fn write_padding(w: &mut dyn fmt::Write, n: usize) -> fmt::Result {
11 w.write_str(&SPACES[..n.min(SPACES.len())])
12}
13
14pub fn write_gutter(
15 w: &mut dyn fmt::Write,
16 domain: &str,
17 severity: Severity,
18 message: fmt::Arguments<'_>,
19 gutter_width: usize,
20) -> fmt::Result {
21 let group = domain::classify(domain);
22 let label_color = group.label_color();
23 let msg_color = severity.message_color();
24 let padding = gutter_width.saturating_sub(domain.len() + 1);
25 write_padding(w, padding)?;
26 write!(
27 w,
28 "{}{}{}{} {}|{} {}{}{}",
29 Bold,
30 Fg(label_color),
31 domain,
32 Reset,
33 Fg(palette::BAR_DIM),
34 Reset,
35 Fg(msg_color),
36 message,
37 Reset
38 )
39}
40
41pub fn write_message_only(
42 w: &mut dyn fmt::Write,
43 severity: Severity,
44 message: fmt::Arguments<'_>,
45) -> fmt::Result {
46 write!(w, "{}{}{}", Fg(severity.message_color()), message, Reset)
47}
48
49pub fn write_gutter_label(
50 w: &mut dyn fmt::Write,
51 domain: &str,
52 dim: bool,
53 gutter_width: usize,
54) -> fmt::Result {
55 let group = domain::classify(domain);
56 let label_color = group.label_color();
57 let padding = gutter_width.saturating_sub(domain.len() + 1);
58 write_padding(w, padding)?;
59 match dim {
60 true => write!(
61 w,
62 "{}{}{}{} {}|{} ",
63 Dim,
64 Fg(label_color),
65 domain,
66 Reset,
67 Fg(palette::BAR_DIM),
68 Reset
69 ),
70 false => write!(
71 w,
72 "{}{}{}{} {}|{} ",
73 Bold,
74 Fg(label_color),
75 domain,
76 Reset,
77 Fg(palette::BAR_DIM),
78 Reset
79 ),
80 }
81}
82
83pub fn write_continuation(w: &mut dyn fmt::Write, gutter_width: usize) -> fmt::Result {
84 write_padding(w, gutter_width)?;
85 write!(w, "{}|{} ", Fg(palette::BAR_DIM), Reset)
86}