Skip to content

Commit 7d90700

Browse files
committed
fix(easy): Escape tokens in errors
Fixes Marwes#333
1 parent 84ceb76 commit 7d90700

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

src/stream/easy.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,41 @@ 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) => escaped_token(c, '`', f),
166+
Info::Range(ref c) => escaped_token(c, '`', f),
167167
Info::Owned(ref s) => write!(f, "{}", s),
168168
Info::Static(s) => write!(f, "{}", s),
169169
}
170170
}
171171
}
172172

173+
fn escaped_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+
write!(f, "{}", quote)?;
180+
for c in token.chars() {
181+
match c {
182+
'\t' | '\n' | '\r' => {
183+
write!(f, "{}", c.escape_debug())?;
184+
}
185+
c if c.is_ascii_control() => {
186+
write!(f, "{}", c.escape_debug())?;
187+
}
188+
c if c == quote => {
189+
write!(f, "\\{}", quote)?;
190+
}
191+
_ => {
192+
write!(f, "{}", c)?;
193+
}
194+
}
195+
}
196+
write!(f, "{}", quote)?;
197+
Ok(())
198+
}
199+
173200
impl<R> From<char> for Info<char, R> {
174201
fn from(s: char) -> Info<char, R> {
175202
Info::Token(s)

0 commit comments

Comments
 (0)