use super::util::take_hex_digits;
pub(super) fn unicode_escape_decode(input: &str) -> Result<String, ()> {
let mut decoded_text = String::with_capacity(input.len());
let mut chars = input.chars().peekable();
while let Some(ch) = chars.next() {
if ch != '\\' {
decoded_text.push(ch);
continue;
}
match chars.next() {
Some('u') => {
let code = take_hex_digits(&mut chars, 4)?;
decoded_text.push(char::from_u32(code).ok_or(())?);
}
Some('x') => {
let code = take_hex_digits(&mut chars, 2)?;
decoded_text.push(char::from_u32(code).ok_or(())?);
}
Some(escaped) => decoded_text.push(escaped),
None => return Err(()),
}
}
Ok(decoded_text)
}