Skip to content

Commit d0c65b2

Browse files
committed
fix!: Move format options to Renderer
BREAKING CHANGE: This removes `opt` from `Snippet`
1 parent 9076cbf commit d0c65b2

22 files changed

+208
-220
lines changed

benches/simple.rs

+5-11
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,9 @@ extern crate criterion;
55
use criterion::{black_box, Criterion};
66

77
use annotate_snippets::renderer::Renderer;
8-
use annotate_snippets::{
9-
display_list::FormatOptions,
10-
snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation},
11-
};
8+
use annotate_snippets::snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation};
129

13-
fn create_snippet() {
10+
fn create_snippet(renderer: Renderer) {
1411
let snippet = Snippet {
1512
slices: vec![Slice {
1613
source: r#") -> Option<String> {
@@ -57,18 +54,15 @@ fn create_snippet() {
5754
annotation_type: AnnotationType::Error,
5855
}),
5956
footer: vec![],
60-
opt: FormatOptions {
61-
color: true,
62-
..Default::default()
63-
},
6457
};
6558

66-
let renderer = Renderer;
6759
let _result = renderer.render(snippet).to_string();
6860
}
6961

7062
pub fn criterion_benchmark(c: &mut Criterion) {
71-
c.bench_function("format", |b| b.iter(|| black_box(create_snippet())));
63+
c.bench_function("format", |b| {
64+
b.iter(|| black_box(create_snippet(Renderer::plain())))
65+
});
7266
}
7367

7468
criterion_group!(benches, criterion_benchmark);

examples/expected_type.rs

+2-9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
use annotate_snippets::renderer::Renderer;
2-
use annotate_snippets::{
3-
display_list::FormatOptions,
4-
snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation},
5-
};
2+
use annotate_snippets::snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation};
63

74
fn main() {
85
let snippet = Snippet {
@@ -33,12 +30,8 @@ fn main() {
3330
},
3431
],
3532
}],
36-
opt: FormatOptions {
37-
color: true,
38-
..Default::default()
39-
},
4033
};
4134

42-
let renderer = Renderer;
35+
let renderer = Renderer::plain();
4336
println!("{}", renderer.render(snippet));
4437
}

examples/footer.rs

+2-9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
use annotate_snippets::renderer::Renderer;
2-
use annotate_snippets::{
3-
display_list::FormatOptions,
4-
snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation},
5-
};
2+
use annotate_snippets::snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation};
63

74
fn main() {
85
let snippet = Snippet {
@@ -29,12 +26,8 @@ fn main() {
2926
annotation_type: AnnotationType::Error,
3027
}],
3128
}],
32-
opt: FormatOptions {
33-
color: true,
34-
..Default::default()
35-
},
3629
};
3730

38-
let renderer = Renderer;
31+
let renderer = Renderer::plain();
3932
println!("{}", renderer.render(snippet));
4033
}

examples/format.rs

+2-9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
use annotate_snippets::renderer::Renderer;
2-
use annotate_snippets::{
3-
display_list::FormatOptions,
4-
snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation},
5-
};
2+
use annotate_snippets::snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation};
63

74
fn main() {
85
let snippet = Snippet {
@@ -51,12 +48,8 @@ fn main() {
5148
annotation_type: AnnotationType::Error,
5249
}),
5350
footer: vec![],
54-
opt: FormatOptions {
55-
color: true,
56-
..Default::default()
57-
},
5851
};
5952

60-
let renderer = Renderer;
53+
let renderer = Renderer::plain();
6154
println!("{}", renderer.render(snippet));
6255
}

examples/multislice.rs

+2-9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
use annotate_snippets::renderer::Renderer;
2-
use annotate_snippets::{
3-
display_list::FormatOptions,
4-
snippet::{Annotation, AnnotationType, Slice, Snippet},
5-
};
2+
use annotate_snippets::snippet::{Annotation, AnnotationType, Slice, Snippet};
63

74
fn main() {
85
let snippet = Snippet {
@@ -28,12 +25,8 @@ fn main() {
2825
annotations: vec![],
2926
},
3027
],
31-
opt: FormatOptions {
32-
color: true,
33-
..Default::default()
34-
},
3528
};
3629

37-
let renderer = Renderer;
30+
let renderer = Renderer::plain();
3831
println!("{}", renderer.render(snippet));
3932
}

src/display_list/mod.rs

+18-25
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,28 @@ impl<'a> Display for DisplayList<'a> {
108108
}
109109

110110
impl<'a> From<snippet::Snippet<'a>> for DisplayList<'a> {
111-
fn from(
111+
fn from(snippet: snippet::Snippet<'a>) -> DisplayList<'a> {
112+
Self::new(snippet, false, false, None)
113+
}
114+
}
115+
116+
impl<'a> DisplayList<'a> {
117+
const ANONYMIZED_LINE_NUM: &'static str = "LL";
118+
const ERROR_TXT: &'static str = "error";
119+
const HELP_TXT: &'static str = "help";
120+
const INFO_TXT: &'static str = "info";
121+
const NOTE_TXT: &'static str = "note";
122+
const WARNING_TXT: &'static str = "warning";
123+
124+
pub(crate) fn new(
112125
snippet::Snippet {
113126
title,
114127
footer,
115128
slices,
116-
opt,
117129
}: snippet::Snippet<'a>,
130+
color: bool,
131+
anonymized_line_numbers: bool,
132+
margin: Option<Margin>,
118133
) -> DisplayList<'a> {
119134
let mut body = vec![];
120135
if let Some(annotation) = title {
@@ -126,36 +141,21 @@ impl<'a> From<snippet::Snippet<'a>> for DisplayList<'a> {
126141
slice,
127142
idx == 0,
128143
!footer.is_empty(),
129-
opt.margin,
144+
margin,
130145
));
131146
}
132147

133148
for annotation in footer {
134149
body.append(&mut format_annotation(annotation));
135150
}
136151

137-
let FormatOptions {
138-
color,
139-
anonymized_line_numbers,
140-
margin,
141-
} = opt;
142-
143152
Self {
144153
body,
145154
stylesheet: get_term_style(color),
146155
anonymized_line_numbers,
147156
margin,
148157
}
149158
}
150-
}
151-
152-
impl<'a> DisplayList<'a> {
153-
const ANONYMIZED_LINE_NUM: &'static str = "LL";
154-
const ERROR_TXT: &'static str = "error";
155-
const HELP_TXT: &'static str = "help";
156-
const INFO_TXT: &'static str = "info";
157-
const NOTE_TXT: &'static str = "note";
158-
const WARNING_TXT: &'static str = "warning";
159159

160160
#[inline]
161161
fn format_annotation_type(
@@ -527,13 +527,6 @@ impl<'a> DisplayList<'a> {
527527
}
528528
}
529529

530-
#[derive(Debug, Default, Copy, Clone)]
531-
pub struct FormatOptions {
532-
pub color: bool,
533-
pub anonymized_line_numbers: bool,
534-
pub margin: Option<Margin>,
535-
}
536-
537530
#[derive(Clone, Copy, Debug)]
538531
pub struct Margin {
539532
/// The available whitespace in the left that can be consumed when centering.

src/renderer/mod.rs

+46-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,54 @@
1-
use crate::display_list::DisplayList;
1+
use crate::display_list::{DisplayList, Margin};
22
use crate::snippet::Snippet;
33
use std::fmt::Display;
44

5-
pub struct Renderer;
5+
#[derive(Clone)]
6+
pub struct Renderer {
7+
color: bool,
8+
anonymized_line_numbers: bool,
9+
margin: Option<Margin>,
10+
}
611

712
impl Renderer {
13+
/// No terminal styling
14+
pub fn plain() -> Self {
15+
Self {
16+
color: false,
17+
anonymized_line_numbers: false,
18+
margin: None,
19+
}
20+
}
21+
22+
/// Default terminal styling
23+
pub fn styled() -> Self {
24+
Self {
25+
color: true,
26+
anonymized_line_numbers: false,
27+
margin: None,
28+
}
29+
}
30+
31+
pub fn anonymized_line_numbers(mut self, anonymized_line_numbers: bool) -> Self {
32+
self.anonymized_line_numbers = anonymized_line_numbers;
33+
self
34+
}
35+
36+
pub fn color(mut self, color: bool) -> Self {
37+
self.color = color;
38+
self
39+
}
40+
41+
pub fn margin(mut self, margin: Option<Margin>) -> Self {
42+
self.margin = margin;
43+
self
44+
}
45+
846
pub fn render<'a>(&'a self, snippet: Snippet<'a>) -> impl Display + 'a {
9-
DisplayList::from(snippet)
47+
DisplayList::new(
48+
snippet,
49+
self.color,
50+
self.anonymized_line_numbers,
51+
self.margin,
52+
)
1053
}
1154
}

src/snippet.rs

-3
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,15 @@
2828
//! annotations: vec![],
2929
//! },
3030
//! ],
31-
//! opt: Default::default(),
3231
//! };
3332
//! ```
34-
use crate::display_list::FormatOptions;
3533
3634
/// Primary structure provided for formatting
3735
#[derive(Debug, Default)]
3836
pub struct Snippet<'a> {
3937
pub title: Option<Annotation<'a>>,
4038
pub footer: Vec<Annotation<'a>>,
4139
pub slices: Vec<Slice<'a>>,
42-
pub opt: FormatOptions,
4340
}
4441

4542
/// Structure containing the slice of text to be annotated and

0 commit comments

Comments
 (0)