Flatten unescape_string a bit 🥞

This commit is contained in:
Laurenz 2020-09-30 19:07:45 +02:00
parent 4077a7c11e
commit 0ddab1c00d

View File

@ -7,17 +7,24 @@ pub fn unescape_string(string: &str) -> String {
let mut out = String::with_capacity(string.len());
while let Some(c) = iter.next() {
if c == '\\' {
if c != '\\' {
out.push(c);
continue;
}
match iter.next() {
Some('\\') => out.push('\\'),
Some('"') => out.push('"'),
Some('n') => out.push('\n'),
Some('t') => out.push('\t'),
Some('u') if iter.peek() == Some(&'{') => {
iter.next();
// TODO: Feedback if closing brace is missing.
let mut sequence = String::new();
let terminated = loop {
match iter.peek() {
// TODO: Feedback that closing brace is missing.
Some('}') => {
iter.next();
break true;
@ -30,10 +37,10 @@ pub fn unescape_string(string: &str) -> String {
}
};
// TODO: Feedback that escape sequence is wrong.
if let Some(c) = hex_to_char(&sequence) {
out.push(c);
} else {
// TODO: Feedback that escape sequence is wrong.
out.push_str("\\u{");
out.push_str(&sequence);
if terminated {
@ -41,16 +48,11 @@ pub fn unescape_string(string: &str) -> String {
}
}
}
Some('n') => out.push('\n'),
Some('t') => out.push('\t'),
Some(c) => {
other => {
out.push('\\');
out.push(c);
out.extend(other);
}
None => out.push('\\'),
}
} else {
out.push(c);
}
}