Skip to content

Commit 04d29a5

Browse files
committed
fix(easy): Escape tokens in errors
Fixes Marwes#333
1 parent fdd63e2 commit 04d29a5

File tree

1 file changed

+27
-2
lines changed

1 file changed

+27
-2
lines changed

src/stream/easy.rs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,39 @@ impl<T: PartialEq, R: PartialEq> PartialEq for Info<T, R> {
162162
impl<T: fmt::Display, R: fmt::Display> fmt::Display for Info<T, R> {
163163
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
164164
match *self {
165-
Info::Token(ref c) => write!(f, "{}", c),
166-
Info::Range(ref c) => write!(f, "{}", c),
165+
Info::Token(ref c) => escape_token(c, '`', f),
166+
Info::Range(ref c) => escape_token(c, '`', f),
167167
Info::Owned(ref s) => write!(f, "{}", s),
168168
Info::Static(s) => write!(f, "{}", s),
169169
}
170170
}
171171
}
172172

173+
fn escape_token<T: fmt::Display>(
174+
token: &T,
175+
quote: char,
176+
f: &mut fmt::Formatter<'_>,
177+
) -> fmt::Result {
178+
let token = token.to_string();
179+
for c in token.chars() {
180+
match c {
181+
'\t' | '\n' | '\r' => {
182+
write!(f, "{}", c.escape_debug())?;
183+
}
184+
c if c.is_ascii_control() => {
185+
write!(f, "{}", c.escape_debug())?;
186+
}
187+
c if c == quote => {
188+
write!(f, "\\{}", quote)?;
189+
}
190+
_ => {
191+
write!(f, "{}", c)?;
192+
}
193+
}
194+
}
195+
Ok(())
196+
}
197+
173198
impl<R> From<char> for Info<char, R> {
174199
fn from(s: char) -> Info<char, R> {
175200
Info::Token(s)

0 commit comments

Comments
 (0)