Skip to content

Commit c821084

Browse files
committed
fix!: Make Annotation labels optional
1 parent 86823c4 commit c821084

File tree

8 files changed

+72
-52
lines changed

8 files changed

+72
-52
lines changed

benches/simple.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ extern crate criterion;
44

55
use criterion::{black_box, Criterion};
66

7-
use annotate_snippets::{Label, Level, Renderer, Snippet};
7+
use annotate_snippets::{Level, Renderer, Snippet};
88

99
fn create_snippet(renderer: Renderer) {
1010
let source = r#") -> Option<String> {
@@ -34,9 +34,15 @@ fn create_snippet(renderer: Renderer) {
3434
.line_start(51)
3535
.origin("src/format.rs")
3636
.annotation(
37-
Label::warning("expected `Option<String>` because of return type").span(5..19),
37+
Level::Warning
38+
.span(5..19)
39+
.label("expected `Option<String>` because of return type"),
3840
)
39-
.annotation(Label::error("expected enum `std::option::Option`").span(26..724)),
41+
.annotation(
42+
Level::Error
43+
.span(26..724)
44+
.label("expected enum `std::option::Option`"),
45+
),
4046
);
4147

4248
let _result = renderer.render(message).to_string();

examples/expected_type.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use annotate_snippets::{Label, Level, Renderer, Snippet};
1+
use annotate_snippets::{Level, Renderer, Snippet};
22

33
fn main() {
44
let source = r#" annotations: vec![SourceAnnotation {
@@ -11,12 +11,11 @@ fn main() {
1111
.origin("examples/footer.rs")
1212
.fold(true)
1313
.annotation(
14-
Label::error(
15-
"expected struct `annotate_snippets::snippet::Slice`, found reference",
16-
)
17-
.span(193..195),
14+
Level::Error
15+
.span(193..195)
16+
.label("expected struct `annotate_snippets::snippet::Slice`, found reference"),
1817
)
19-
.annotation(Label::info("while parsing this struct").span(34..50)),
18+
.annotation(Level::Info.span(34..50).label("while parsing this struct")),
2019
);
2120

2221
let renderer = Renderer::styled();

examples/footer.rs

+14-16
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
11
use annotate_snippets::{Label, Level, Renderer, Snippet};
22

33
fn main() {
4-
let message = Level::Error
5-
.title("mismatched types")
6-
.id("E0308")
7-
.snippet(
8-
Snippet::source(" slices: vec![\"A\",")
9-
.line_start(13)
10-
.origin("src/multislice.rs")
11-
.annotation(
12-
Label::error(
4+
let message =
5+
Level::Error
6+
.title("mismatched types")
7+
.id("E0308")
8+
.snippet(
9+
Snippet::source(" slices: vec![\"A\",")
10+
.line_start(13)
11+
.origin("src/multislice.rs")
12+
.annotation(Level::Error.span(21..24).label(
1313
"expected struct `annotate_snippets::snippet::Slice`, found reference",
14-
)
15-
.span(21..24),
16-
),
17-
)
18-
.footer(Label::note(
19-
"expected type: `snippet::Annotation`\n found type: `__&__snippet::Annotation`",
20-
));
14+
)),
15+
)
16+
.footer(Label::note(
17+
"expected type: `snippet::Annotation`\n found type: `__&__snippet::Annotation`",
18+
));
2119

2220
let renderer = Renderer::styled();
2321
anstream::println!("{}", renderer.render(message));

examples/format.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use annotate_snippets::{Label, Level, Renderer, Snippet};
1+
use annotate_snippets::{Level, Renderer, Snippet};
22

33
fn main() {
44
let source = r#") -> Option<String> {
@@ -28,9 +28,15 @@ fn main() {
2828
.line_start(51)
2929
.origin("src/format.rs")
3030
.annotation(
31-
Label::warning("expected `Option<String>` because of return type").span(5..19),
31+
Level::Warning
32+
.span(5..19)
33+
.label("expected `Option<String>` because of return type"),
3234
)
33-
.annotation(Label::error("expected enum `std::option::Option`").span(26..724)),
35+
.annotation(
36+
Level::Error
37+
.span(26..724)
38+
.label("expected enum `std::option::Option`"),
39+
),
3440
);
3541

3642
let renderer = Renderer::styled();

src/renderer/display_list.rs

+9-5
Original file line numberDiff line numberDiff line change
@@ -1040,7 +1040,7 @@ fn format_body(
10401040
annotation: Annotation {
10411041
annotation_type,
10421042
id: None,
1043-
label: format_label(Some(annotation.label), None),
1043+
label: format_label(annotation.label, None),
10441044
},
10451045
range,
10461046
annotation_type: DisplayAnnotationType::from(annotation.level),
@@ -1134,7 +1134,7 @@ fn format_body(
11341134
annotation: Annotation {
11351135
annotation_type,
11361136
id: None,
1137-
label: format_label(Some(annotation.label), None),
1137+
label: format_label(annotation.label, None),
11381138
},
11391139
range,
11401140
annotation_type: DisplayAnnotationType::from(annotation.level),
@@ -1371,7 +1371,11 @@ mod tests {
13711371
let input = snippet::Level::Error.title("").snippet(
13721372
snippet::Snippet::source(&source)
13731373
.line_start(5402)
1374-
.annotation(snippet::Label::info("Test annotation").span(range.clone())),
1374+
.annotation(
1375+
snippet::Level::Info
1376+
.span(range.clone())
1377+
.label("Test annotation"),
1378+
),
13751379
);
13761380
let output = from_display_lines(vec![
13771381
DisplayLine::Raw(DisplayRawLine::Annotation {
@@ -1478,7 +1482,7 @@ mod tests {
14781482
let input = snippet::Level::Error.title("").snippet(
14791483
snippet::Snippet::source(source)
14801484
.line_start(0)
1481-
.annotation(snippet::Label::error(label).span(0..source.len() + 2)),
1485+
.annotation(snippet::Level::Error.span(0..source.len() + 2).label(label)),
14821486
);
14831487
let _ = DisplayList::new(input, &STYLESHEET, false, None);
14841488
}
@@ -1490,7 +1494,7 @@ mod tests {
14901494
.line_start(1)
14911495
.origin("<current file>")
14921496
.fold(true)
1493-
.annotation(snippet::Label::error("oops").span(19..23)),
1497+
.annotation(snippet::Level::Error.span(19..23).label("oops")),
14941498
);
14951499

14961500
let expected = from_display_lines(vec![

src/snippet.rs

+18-11
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,6 @@ impl<'a> Label<'a> {
7373
self.label = label;
7474
self
7575
}
76-
77-
/// Create a [`Annotation`] with the given span for a [`Snippet`]
78-
pub fn span(&self, span: Range<usize>) -> Annotation<'a> {
79-
Annotation {
80-
range: span,
81-
label: self.label,
82-
level: self.level,
83-
}
84-
}
8576
}
8677

8778
/// Structure containing the slice of text to be annotated and
@@ -133,15 +124,22 @@ impl<'a> Snippet<'a> {
133124

134125
/// An annotation for a [`Snippet`].
135126
///
136-
/// This gets created by [`Label::span`].
127+
/// See [`Level::span`] to create a [`Annotation`]
137128
#[derive(Debug)]
138129
pub struct Annotation<'a> {
139130
/// The byte range of the annotation in the `source` string
140131
pub(crate) range: Range<usize>,
141-
pub(crate) label: &'a str,
132+
pub(crate) label: Option<&'a str>,
142133
pub(crate) level: Level,
143134
}
144135

136+
impl<'a> Annotation<'a> {
137+
pub fn label(mut self, label: &'a str) -> Self {
138+
self.label = Some(label);
139+
self
140+
}
141+
}
142+
145143
/// Types of annotations.
146144
#[derive(Debug, Clone, Copy, PartialEq)]
147145
pub enum Level {
@@ -164,4 +162,13 @@ impl Level {
164162
footer: vec![],
165163
}
166164
}
165+
166+
/// Create a [`Annotation`] with the given span for a [`Snippet`]
167+
pub fn span<'a>(self, span: Range<usize>) -> Annotation<'a> {
168+
Annotation {
169+
range: span,
170+
label: None,
171+
level: self,
172+
}
173+
}
167174
}

tests/fixtures/deserialize.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ impl<'a> From<AnnotationDef<'a>> for Annotation<'a> {
147147
label,
148148
level,
149149
} = val;
150-
Label::new(level, label).span(range)
150+
level.span(range).label(label)
151151
}
152152
}
153153

tests/formatter.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
use annotate_snippets::{Label, Level, Renderer, Snippet};
1+
use annotate_snippets::{Level, Renderer, Snippet};
22

33
#[test]
44
fn test_i_29() {
55
let snippets = Level::Error.title("oops").snippet(
66
Snippet::source("First line\r\nSecond oops line")
77
.origin("<current file>")
8-
.annotation(Label::error("oops").span(19..23))
8+
.annotation(Level::Error.span(19..23).label("oops"))
99
.fold(true),
1010
);
1111
let expected = r#"error: oops
@@ -25,7 +25,7 @@ fn test_point_to_double_width_characters() {
2525
let snippets = Level::Error.title("").snippet(
2626
Snippet::source("こんにちは、世界")
2727
.origin("<current file>")
28-
.annotation(Label::error("world").span(12..16)),
28+
.annotation(Level::Error.span(12..16).label("world")),
2929
);
3030

3131
let expected = r#"error
@@ -44,7 +44,7 @@ fn test_point_to_double_width_characters_across_lines() {
4444
let snippets = Level::Error.title("").snippet(
4545
Snippet::source("おはよう\nございます")
4646
.origin("<current file>")
47-
.annotation(Label::error("Good morning").span(4..15)),
47+
.annotation(Level::Error.span(4..15).label("Good morning")),
4848
);
4949

5050
let expected = r#"error
@@ -65,8 +65,8 @@ fn test_point_to_double_width_characters_multiple() {
6565
let snippets = Level::Error.title("").snippet(
6666
Snippet::source("お寿司\n食べたい🍣")
6767
.origin("<current file>")
68-
.annotation(Label::error("Sushi1").span(0..6))
69-
.annotation(Label::note("Sushi2").span(11..15)),
68+
.annotation(Level::Error.span(0..6).label("Sushi1"))
69+
.annotation(Level::Note.span(11..15).label("Sushi2")),
7070
);
7171

7272
let expected = r#"error
@@ -87,7 +87,7 @@ fn test_point_to_double_width_characters_mixed() {
8787
let snippets = Level::Error.title("").snippet(
8888
Snippet::source("こんにちは、新しいWorld!")
8989
.origin("<current file>")
90-
.annotation(Label::error("New world").span(12..23)),
90+
.annotation(Level::Error.span(12..23).label("New world")),
9191
);
9292

9393
let expected = r#"error

0 commit comments

Comments
 (0)