Skip to content

Commit ce736be

Browse files
committed
fix!: Generalize footer to be any Message
Fixes #96
1 parent 25d519a commit ce736be

File tree

4 files changed

+28
-72
lines changed

4 files changed

+28
-72
lines changed

examples/footer.rs

+2-2
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 message =
@@ -13,7 +13,7 @@ fn main() {
1313
"expected struct `annotate_snippets::snippet::Slice`, found reference",
1414
)),
1515
)
16-
.footer(Label::note(
16+
.footer(Level::Note.title(
1717
"expected type: `snippet::Annotation`\n found type: `__&__snippet::Annotation`",
1818
));
1919

src/renderer/display_list.rs

+20-11
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ impl<'a> DisplayList<'a> {
111111
anonymized_line_numbers: bool,
112112
margin: Option<Margin>,
113113
) -> DisplayList<'a> {
114-
let body = format_message(message, margin);
114+
let body = format_message(message, margin, true);
115115

116116
Self {
117117
body,
@@ -698,19 +698,24 @@ impl<'a> Iterator for CursorLines<'a> {
698698
}
699699
}
700700

701-
fn format_message<'a>(
701+
fn format_message(
702702
snippet::Message {
703703
level,
704704
id,
705705
title,
706706
footer,
707707
snippets,
708-
}: snippet::Message<'a>,
708+
}: snippet::Message<'_>,
709709
margin: Option<Margin>,
710-
) -> Vec<DisplayLine<'a>> {
710+
primary: bool,
711+
) -> Vec<DisplayLine<'_>> {
711712
let mut body = vec![];
712713

713-
body.push(format_title(level, id, title));
714+
if !snippets.is_empty() || primary {
715+
body.push(format_title(level, id, title));
716+
} else {
717+
body.append(&mut format_footer(level, id, title));
718+
}
714719

715720
for (idx, snippet) in snippets.into_iter().enumerate() {
716721
body.append(&mut format_snippet(
@@ -722,7 +727,7 @@ fn format_message<'a>(
722727
}
723728

724729
for annotation in footer {
725-
body.append(&mut format_footer(annotation));
730+
body.append(&mut format_message(annotation, margin, false));
726731
}
727732

728733
body
@@ -740,13 +745,17 @@ fn format_title<'a>(level: crate::Level, id: Option<&'a str>, label: &'a str) ->
740745
})
741746
}
742747

743-
fn format_footer(footer: snippet::Label<'_>) -> Vec<DisplayLine<'_>> {
748+
fn format_footer<'a>(
749+
level: crate::Level,
750+
id: Option<&'a str>,
751+
label: &'a str,
752+
) -> Vec<DisplayLine<'a>> {
744753
let mut result = vec![];
745-
for (i, line) in footer.label.lines().enumerate() {
754+
for (i, line) in label.lines().enumerate() {
746755
result.push(DisplayLine::Raw(DisplayRawLine::Annotation {
747756
annotation: Annotation {
748-
annotation_type: DisplayAnnotationType::from(footer.level),
749-
id: None,
757+
annotation_type: DisplayAnnotationType::from(level),
758+
id,
750759
label: format_label(Some(line), None),
751760
},
752761
source_aligned: true,
@@ -1447,7 +1456,7 @@ mod tests {
14471456
fn test_format_label() {
14481457
let input = snippet::Level::Error
14491458
.title("")
1450-
.footer(snippet::Label::error("This __is__ a title"));
1459+
.footer(snippet::Level::Error.title("This __is__ a title"));
14511460
let output = from_display_lines(vec![
14521461
DisplayLine::Raw(DisplayRawLine::Annotation {
14531462
annotation: Annotation {

src/snippet.rs

+3-38
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub struct Message<'a> {
2020
pub(crate) id: Option<&'a str>,
2121
pub(crate) title: &'a str,
2222
pub(crate) snippets: Vec<Snippet<'a>>,
23-
pub(crate) footer: Vec<Label<'a>>,
23+
pub(crate) footer: Vec<Message<'a>>,
2424
}
2525

2626
impl<'a> Message<'a> {
@@ -39,52 +39,17 @@ impl<'a> Message<'a> {
3939
self
4040
}
4141

42-
pub fn footer(mut self, footer: Label<'a>) -> Self {
42+
pub fn footer(mut self, footer: Message<'a>) -> Self {
4343
self.footer.push(footer);
4444
self
4545
}
4646

47-
pub fn footers(mut self, footer: impl IntoIterator<Item = Label<'a>>) -> Self {
47+
pub fn footers(mut self, footer: impl IntoIterator<Item = Message<'a>>) -> Self {
4848
self.footer.extend(footer);
4949
self
5050
}
5151
}
5252

53-
pub struct Label<'a> {
54-
pub(crate) level: Level,
55-
pub(crate) label: &'a str,
56-
}
57-
58-
impl<'a> Label<'a> {
59-
pub fn new(level: Level, label: &'a str) -> Self {
60-
Self { level, label }
61-
}
62-
pub fn error(label: &'a str) -> Self {
63-
Self::new(Level::Error, label)
64-
}
65-
66-
pub fn warning(label: &'a str) -> Self {
67-
Self::new(Level::Warning, label)
68-
}
69-
70-
pub fn info(label: &'a str) -> Self {
71-
Self::new(Level::Info, label)
72-
}
73-
74-
pub fn note(label: &'a str) -> Self {
75-
Self::new(Level::Note, label)
76-
}
77-
78-
pub fn help(label: &'a str) -> Self {
79-
Self::new(Level::Help, label)
80-
}
81-
82-
pub fn label(mut self, label: &'a str) -> Self {
83-
self.label = label;
84-
self
85-
}
86-
}
87-
8853
/// Structure containing the slice of text to be annotated and
8954
/// basic information about the location of the slice.
9055
///

tests/fixtures/deserialize.rs

+3-21
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use serde::{Deserialize, Deserializer, Serialize};
22
use std::ops::Range;
33

4-
use annotate_snippets::{renderer::Margin, Annotation, Label, Level, Message, Renderer, Snippet};
4+
use annotate_snippets::{renderer::Margin, Annotation, Level, Message, Renderer, Snippet};
55

66
#[derive(Deserialize)]
77
pub struct Fixture<'a> {
@@ -20,10 +20,9 @@ pub struct MessageDef<'a> {
2020
#[serde(default)]
2121
#[serde(borrow)]
2222
pub id: Option<&'a str>,
23-
#[serde(deserialize_with = "deserialize_labels")]
2423
#[serde(default)]
2524
#[serde(borrow)]
26-
pub footer: Vec<Label<'a>>,
25+
pub footer: Vec<MessageDef<'a>>,
2726
#[serde(deserialize_with = "deserialize_snippets")]
2827
#[serde(borrow)]
2928
pub snippets: Vec<Snippet<'a>>,
@@ -43,28 +42,11 @@ impl<'a> From<MessageDef<'a>> for Message<'a> {
4342
message = message.id(id);
4443
}
4544
message = message.snippets(snippets);
46-
message = message.footers(footer);
45+
message = message.footers(footer.into_iter().map(Into::into));
4746
message
4847
}
4948
}
5049

51-
fn deserialize_labels<'de, D>(deserializer: D) -> Result<Vec<Label<'de>>, D::Error>
52-
where
53-
D: Deserializer<'de>,
54-
{
55-
#[derive(Deserialize)]
56-
struct Wrapper<'a>(
57-
#[serde(with = "LabelDef")]
58-
#[serde(borrow)]
59-
LabelDef<'a>,
60-
);
61-
62-
let v = Vec::deserialize(deserializer)?;
63-
Ok(v.into_iter()
64-
.map(|Wrapper(a)| Label::new(a.level, a.label))
65-
.collect())
66-
}
67-
6850
fn deserialize_snippets<'de, D>(deserializer: D) -> Result<Vec<Snippet<'de>>, D::Error>
6951
where
7052
D: Deserializer<'de>,

0 commit comments

Comments
 (0)