Skip to content

Commit 9342df8

Browse files
committed
feat: Renderer::render_to(impl Write, ..)
1 parent 7227fd3 commit 9342df8

File tree

3 files changed

+33
-20
lines changed

3 files changed

+33
-20
lines changed

src/renderer/mod.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ pub(crate) mod stylesheet;
2525
mod margin;
2626
mod styled_buffer;
2727

28+
use std::fmt;
29+
2830
use crate::Report;
2931

3032
pub(crate) use render::normalize_whitespace;
@@ -193,7 +195,14 @@ impl Renderer {
193195
impl Renderer {
194196
/// Render a diagnostic [`Report`]
195197
pub fn render(&self, groups: Report<'_>) -> String {
196-
render::render(self, groups)
198+
let mut s = String::new();
199+
self.render_to(&mut s, groups)
200+
.expect("String::write_fmt is infallible");
201+
s
202+
}
203+
/// Render a diagnostic [`Report`] to the given [`Write`](fmt::Write)r
204+
pub fn render_to<W: fmt::Write>(&self, to: W, groups: Report<'_>) -> fmt::Result {
205+
render::render_to(to, self, groups)
197206
}
198207
}
199208

src/renderer/render.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,20 @@ use crate::{
2424

2525
const ANONYMIZED_LINE_NUM: &str = "LL";
2626

27-
pub(crate) fn render(renderer: &Renderer, groups: Report<'_>) -> String {
27+
pub(crate) fn render_to(
28+
mut to: impl fmt::Write,
29+
renderer: &Renderer,
30+
groups: Report<'_>,
31+
) -> fmt::Result {
2832
if renderer.short_message {
29-
render_short_message(renderer, groups).unwrap()
33+
render_short_message(to, renderer, groups)
3034
} else {
3135
let (max_line_num, og_primary_path, groups) = pre_process(groups);
3236
let max_line_num_len = if renderer.anonymized_line_numbers {
3337
ANONYMIZED_LINE_NUM.len()
3438
} else {
3539
num_decimal_digits(max_line_num)
3640
};
37-
let mut out_string = String::new();
3841
let group_len = groups.len();
3942
for (
4043
g,
@@ -220,19 +223,21 @@ pub(crate) fn render(renderer: &Renderer, groups: Report<'_>) -> String {
220223
}
221224
}
222225
buffer
223-
.render(&level, &renderer.stylesheet, &mut out_string)
226+
.render_to(&mut to, &level, &renderer.stylesheet)
224227
.unwrap();
225228
if g != group_len - 1 {
226-
use std::fmt::Write;
227-
228-
writeln!(out_string).unwrap();
229+
writeln!(to).unwrap();
229230
}
230231
}
231-
out_string
232+
Ok(())
232233
}
233234
}
234235

235-
fn render_short_message(renderer: &Renderer, groups: &[Group<'_>]) -> Result<String, fmt::Error> {
236+
fn render_short_message(
237+
to: impl fmt::Write,
238+
renderer: &Renderer,
239+
groups: &[Group<'_>],
240+
) -> fmt::Result {
236241
let mut buffer = StyledBuffer::new();
237242
let mut labels = None;
238243
let group = groups.first().expect("Expected at least one group");
@@ -306,10 +311,9 @@ fn render_short_message(renderer: &Renderer, groups: &[Group<'_>]) -> Result<Str
306311
buffer.append(0, &format!(": {labels}"), ElementStyle::NoStyle);
307312
}
308313

309-
let mut out_string = String::new();
310-
buffer.render(&title.level, &renderer.stylesheet, &mut out_string)?;
314+
buffer.render_to(to, &title.level, &renderer.stylesheet)?;
311315

312-
Ok(out_string)
316+
Ok(())
313317
}
314318

315319
#[allow(clippy::too_many_arguments)]

src/renderer/styled_buffer.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,28 +39,28 @@ impl StyledBuffer {
3939
}
4040
}
4141

42-
pub(crate) fn render(
42+
pub(crate) fn render_to(
4343
&self,
44+
mut to: impl Write,
4445
level: &Level<'_>,
4546
stylesheet: &Stylesheet,
46-
str: &mut String,
4747
) -> Result<(), fmt::Error> {
4848
for (i, line) in self.lines.iter().enumerate() {
4949
let mut current_style = stylesheet.none;
5050
for StyledChar { ch, style } in line {
5151
let ch_style = style.color_spec(level, stylesheet);
5252
if ch_style != current_style {
5353
if !line.is_empty() {
54-
write!(str, "{current_style:#}")?;
54+
write!(to, "{current_style:#}")?;
5555
}
5656
current_style = ch_style;
57-
write!(str, "{current_style}")?;
57+
write!(to, "{current_style}")?;
5858
}
59-
write!(str, "{ch}")?;
59+
write!(to, "{ch}")?;
6060
}
61-
write!(str, "{current_style:#}")?;
61+
write!(to, "{current_style:#}")?;
6262
if i != self.lines.len() - 1 {
63-
writeln!(str)?;
63+
writeln!(to)?;
6464
}
6565
}
6666
Ok(())

0 commit comments

Comments
 (0)